我如何使用ostream在c ++中将未签名的char打印为十六进制?

我想在C ++中使用无符号的8位变量。无论是unsigned char或uint8_t做的伎俩,只要算术而言(这是意料之中的,因为据我所知uint8_t仅仅是一个别名unsigned char,还是让调试器的礼物吧。


问题是,如果我在C ++中使用ostream打印出变量,则会将其视为char。如果我有:


unsigned char a = 0;

unsigned char b = 0xff;

cout << "a is " << hex << a <<"; b is " << hex << b << endl;

那么输出是:


a is ^@; b is 377

代替


a is 0; b is ff

我尝试使用uint8_t,但是正如我前面提到的,这是typedefeded的unsigned char,所以也一样。如何正确打印变量?


编辑:我在代码中的很多地方都这样做。有什么方法可以在不强制int每次打印的情况下执行此操作?


心有法竹
浏览 647回答 3
3回答

人到中年有点甜

我建议使用以下技术:struct HexCharStruct{&nbsp; unsigned char c;&nbsp; HexCharStruct(unsigned char _c) : c(_c) { }};inline std::ostream& operator<<(std::ostream& o, const HexCharStruct& hs){&nbsp; return (o << std::hex << (int)hs.c);}inline HexCharStruct hex(unsigned char _c){&nbsp; return HexCharStruct(_c);}int main(){&nbsp; char a = 131;&nbsp; std::cout << hex(a) << std::endl;}它写起来很短,与原始解决方案具有相同的效率,它使您可以选择使用“原始”字符输出。而且它是类型安全的(不使用“邪恶的”宏:-)

一只甜甜圈

使用:cout << "a is " << hex << (int) a <<"; b is " << hex << (int) b << endl;如果要用前导零填充,则:#include <iomanip>...cout << "a is " << setw(2) << setfill('0') << hex << (int) a ;&nbsp;当我们使用C风格的强制转换时,为什么不花大量时间解决C ++终端错误并使用宏呢!#define HEX( x )&nbsp; &nbsp;setw(2) << setfill('0') << hex << (int)( x )然后你可以说cout << "a is " << HEX( a );编辑:话虽如此,MartinStettner的解决方案要好得多!
打开App,查看更多内容
随时随地看视频慕课网APP