十六进制的字符串流>> uint8_t?C++

stringstream >> uint8_t in hex? c++

本文关键字:gt C++ uint8 字符串 十六进制      更新时间:2023-10-16

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

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 J

34 44

,当我们改变时,用

替换第一行
uint16_t x = 0, y = 0x4a;

输出变成:

74年

74

74年

74

4 4

J

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

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

ss >> x

将uint8_t x视为unsigned char。'4'的ascii值是(十进制)52。它将字符串"4a"的第一个字符读入x,就好像x是一个字符一样。当你切换到uint16_t时,它将其视为无符号短整数类型。