web-dev-qa-db-ja.com

stringstreamを使用して16進数をフォーマットする方法

Stringstreamを使用して、符号なしのshortを大文字の0で始まる16進表現に変換しようとしています。大文字と0が正しいとは思えません。ここに私が持っているものがあります:

USHORT id = 1127;
std::stringstream ss;
ss << std::showbase << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
std::string result = ss.str();

これにより、プレフィックスの「0x」ベースも大文字になりますが、小文字にする必要があります。また、プレフィックス0xベース(現在は0X)の後の16進値にプレフィックス0が付加されません。たとえば、これは予想される0x0467ではなく0X467を出力するようになります。どうすれば修正できますか?

21
mtijn

setwは、表示されたベースを含むフォーマットされた出力全体の幅を設定します。これが、先頭の0が表示されない理由です。また、std::showbaseとともにstd::uppercaseを使用する場合、ベースを小文字で表示する方法はありません。解決策は、ベースを手動で挿入してから、残りのマニピュレーターを適用することです。

ss << "0x" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;

これは0x0467を出力します

41
Praetorian