为什么以十六进制读取uint8_t无法正常工作?

时间:2019-06-04 14:38:12

标签: c++ iostream

考虑如下代码:

#include <iostream>
#include <sstream>

int main()
{
    std::stringstream ss;
    ss << "a0 b1";

    uint8_t byte;
    ss >> std::hex >> byte;    

    std::cout << std::hex << byte << std::endl;

    return 0;
}

为什么即使a符合a0的十六进制形式,也输出a0而不是uint8_t

1 个答案:

答案 0 :(得分:12)

由于uint8_t也可能是unsigned char,因此从C ++流执行格式化提取时,'a'也为此special rules exist

很遗憾,this is just an alias, not a distinct type

基本上,它跳过了“词法转换为数字”步骤,因为它认为您想提取一个字符。字符unsigned int

我认为您需要读入uint8_t,然后根据需要缩小尺寸。

如果您确实缩小到read(),还必须将其提升到much the same reason更大的整数(lol),以触发序列化。

live demo

说实话,在处理流时,我只会避免使用较小的固定宽度类型(除非您对write()和{{1}}做无格式的工作)。忘记这个问题太容易了。