13

16進表記を出力しようとしている8バイトの配列があります。を使用printf("%x", array)すると、最初のバイトを取得して出力できますが、取得中などです"0xffffff9b"。「f」なしで表記を取得する方法はありますか?

次のような各要素を印刷したいと思います。

0x9a, 0x43, 0x0D、など。

4

4 に答える 4

19

これ:

printf("%x", array);

ほとんどの場合、配列の最初の要素のアドレスを16進数で出力します。unsigned intアドレスをあたかもそれであるかのように印刷しようとする動作が定義されていないため、「最も可能性が高い」と言います。本当にアドレスを印刷したい場合、それを行う正しい方法は次のようになります。

printf("%p", (void*)array);

(配列式は、ほとんどのコンテキストで、配列の最初の要素へのポインターに暗黙的に変換されます(「減衰」します)。)

配列の各要素を出力する場合は、明示的に出力する必要があります。この"%s"フォーマットは、文字列の最初の文字へのポインタを取り、文字列printfを反復処理して各文字を出力するように指示します。そのようなことを16進数で行う形式はないので、自分で行う必要があります。

たとえば、次のようになります。

unsigned char arr[8];

次のように要素5を印刷できます。

printf("0x%x", arr[5]);

または、先行ゼロが必要な場合:

printf("0x%02x", arr[5]);

"%x"形式にはunsigned int引数が必要であり、渡すunsigned char値は暗黙的ににプロモートされるunsigned intため、これは型が正しいです。"%x"大文字の場合は、16進数af小文字で印刷するために使用できます"%X"(この例では両方を使用しました)。

(この"0x%02x"形式は、バイトが8ビットの場合に最適に機能することに注意してください。これは保証されていませんが、使用する可能性のあるすべてのシステムでほぼ確実に当てはまります。)

適切なループを作成し、出力を区切る方法を決定するのはあなたに任せます。

于 2012-04-29T21:15:21.423 に答える