为什么读取 uint8_t 为十六进制没有按预期工作?

Why is reading uint8_t as hex not working as expected?

考虑这样的代码:

#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 作为十六进制?

因为 uint8_t 也(可能)是 unsigned char,当您从 C++ 流中执行 格式化提取 special rules exist

很遗憾

基本上它会跳过 "lexically convert to a number" 这一步,因为它认为您想要提取一个字符。字符 'a'.

我想你会想阅读 unsigned int 然后在需要时缩小尺寸。

如果你缩小到 uint8_t,你还必须将它提升回更大的 int (lol) much the same reason,以触发序列化。

(live demo)

老实说,在处理流时我会避免使用小型 fixed-width 类型(除非您使用 read()write() 进行无格式工作)。这个问题太容易忘记了。