私はJavaのプログラマで、バイトをstdoutに2種類印刷してみました。intを2バイトの配列にキャスト
unsigned char bytes[2];
//...
printf("%x%x", bytes[0], bytes[1]);
std::cout << bytes[0] << bytes[1];
しかし、これらの方法の出力は異なります。どうして? printf出力をstd::cout
と同じようにするには?
私はJavaのプログラマで、バイトをstdoutに2種類印刷してみました。intを2バイトの配列にキャスト
unsigned char bytes[2];
//...
printf("%x%x", bytes[0], bytes[1]);
std::cout << bytes[0] << bytes[1];
しかし、これらの方法の出力は異なります。どうして? printf出力をstd::cout
と同じようにするには?
std::cout
で、それらは文字として印刷されます。 printf
整数のプロモーションで
が発生し、彼らがint
sと渡される、と%x
指定子は16進形式でunsigned int
を印刷するprintf
に指示します。
あなたは%c
を使って文字を印刷するprintf
を得ることができるか、hex
フラグを自分でプロモーションをやって設定することにより、六角として、それを印刷しstd::cout
を取得することができます。
std::printf("%c%c", bytes[0], bytes[1]);
std::cout << std::hex << +bytes[0] << +bytes[1];
%x
はCSは、例えば、コード
int x = 80;
printf("%x", x);
は50
を印刷する16進数を出力します。
数字を10進数で書くには、%d
を使用する必要があります。また、いない文字、数字の形でchar
変数を印刷するには、あなたがint
にキャストする必要があります。
unsigned char bytes[2];
//...
printf("%d%d", bytes[0], bytes[1]);
std::cout << (int)bytes[0] << (int)bytes[1];
もう一度 –
私のコンピュータでは、このコードは同じ行を印刷します(実際には1行に印刷されますが、いずれにしても同じです)。あなたのケースには何が印刷されていますか? – alexeykuzmin0
@ St.Antario:配列には何が入っていますか? –
相当するものは次のようになります。
#include <iomanip> // needed for std::hex
std::cout << std::hex << static_cast<unsigned int>(bytes[0]) << static_cast<unsigned int>(bytes[1]);
2つの違い:
printf
と%x
は16進数で表示されます.C++ストリームの場合、std::hex
はprintf
は(%x
用)int
値がかかりますが、C++のストリームは、(代わりに、それは文字として印刷されます)整数値としてunsigned char
を出力しますので、あなたがunsigned char
をキャストする必要がoperator<<
を持っていません最初に整数型(例えば、上記のコードのようにunsigned int
)
大文字と小文字の16進数(%x)を返します。 –
'bytes'には何がありますか? –