为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
心有法竹 2019-11-27 10:39:01
我想在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每次打印的情况下执行此操作?
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

我建议使用以下技术:


struct HexCharStruct

{

  unsigned char c;

  HexCharStruct(unsigned char _c) : c(_c) { }

};


inline std::ostream& operator<<(std::ostream& o, const HexCharStruct& hs)

{

  return (o << std::hex << (int)hs.c);

}


inline HexCharStruct hex(unsigned char _c)

{

  return HexCharStruct(_c);

}


int main()

{

  char a = 131;

  std::cout << hex(a) << std::endl;

}

它写起来很短,与原始解决方案具有相同的效率,它使您可以选择使用“原始”字符输出。而且它是类型安全的(不使用“邪恶的”宏:-)


查看完整回答
反对 回复 2019-11-27
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

使用:


cout << "a is " << hex << (int) a <<"; b is " << hex << (int) b << endl;

如果要用前导零填充,则:


#include <iomanip>

...

cout << "a is " << setw(2) << setfill('0') << hex << (int) a ; 

当我们使用C风格的强制转换时,为什么不花大量时间解决C ++终端错误并使用宏呢!


#define HEX( x )

   setw(2) << setfill('0') << hex << (int)( x )

然后你可以说


cout << "a is " << HEX( a );

编辑:话虽如此,MartinStettner的解决方案要好得多!


查看完整回答
反对 回复 2019-11-27
  • 3 回答
  • 0 关注
  • 646 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信