5

我对以下代码的输出感到困惑:

uint8_t x = 0, y = 0x4a;
std::stringstream ss;
std::string a = "4a";


ss << std::hex << a;
ss >> x;

std::cout << (int)x << " "<< (int)y << std::endl;
std::cout << x << " "<< y <<std::endl;
std::cout << std::hex << (int)x <<  " " << (int)y << std::endl;

uint8_t z(x);
std::cout << z;

以上的输出是:

52 74

4 焦

34 4a

4

当我们更改时,将第一行替换为:

uint16_t x = 0, y = 0x4a;

输出变成:

74 74

74 74

4a 4a

Ĵ

我想我明白会发生什么,但我不明白为什么会发生或如何防止它/解决它。据我了解std::hex,修饰符由于 的类型而受到某种程度的破坏,x在技术层面上可能并不完全正确,但它只是写了它读取的第一个字符。

背景:输入应该是一串十六进制数字,每一对代表一个字节(就像一个位图,除了字符串)。我希望能够读取每个字节并将其存储在 a 中uint8_t,所以当我遇到这个问题时我正在试验它。我仍然无法确定什么是最好的方法,所以如果您认为我正在做的事情效率低下或不必要,我会很高兴知道为什么。感谢您的阅读,

4

1 回答 1

2
ss >> x

将 uint8_t x 视为无符号字符。'4' 的 ascii 值是(十进制)52。它将字符串“4a”的第一个字符读入 x,就好像 x 是一个字符一样。当您将其切换到 uint16_t 时,它会将其视为无符号短整数类型。与 y 相同。

于 2015-10-10T05:10:11.047 回答