1. ホーム
  2. c++

c++でostreamを使ってunsigned charをhexで表示するにはどうすればよいですか?

2023-10-18 04:23:08

質問

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 を使おうとしましたが、前に述べたように、この型定義は unsigned char に型付けされているので、同じようになります。 どうすれば正しく変数を表示できるのでしょうか?

編集してください。 私はこれをコード全体の多くの場所で行っています。 私はこれを行うことができます任意の方法はありますか なしで にキャストする int にキャストすることなく、印刷できますか?

どのように解決するのですか?

次のテクニックを使うことをお勧めします。

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;
}

これは書くのが短く、オリジナルのソリューションと同じ効率を持ち、"オリジナル"の文字出力を使うかどうかを選ぶことができます。そしてそれはタイプセーフです ("evil" マクロを使用していません :-))。