为什么读取 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()
进行无格式工作)。这个问题太容易忘记了。
考虑这样的代码:
#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()
进行无格式工作)。这个问题太容易忘记了。