printf: 16 進値を正確に出力する
文字のベクトルを扱う場合、個々のバイトを 16 進数で出力するときに不一致が発生することがよくあります。 printfを使ってフォーマットします。この問題は、単一の char (1 バイトのみ) を出力しようとしたときに発生しますが、代わりにマルチバイト値を取得します。
この動作の背後にある理由は、printf の型マッチングにあります。 %x 修飾子は unsigned int パラメーターを予期しており、通常、char は可変引数関数に渡されるときに int にプロモートされます。このプロモーションにより、単一の char 値を出力するときに不正確な結果が生じる可能性があります。
この問題を解決するには、char を unsigned int に明示的にキャストして、予測可能な結果を保証する必要があります。たとえば、次のコードは 1 バイトを正確に出力します:
printf(" 0x%1x ", (unsigned)pixel_data[0]);
フィールド幅 1 は、単に最小桁数を指定するだけであるため、このコンテキストでは特に有用ではないことに注意することが重要です。表示します。ただし、バイト値を符号なし値として扱い、unsigned int に変換するときにゼロ拡張したい場合は、ベクトルに unsigned char を使用するか、特定のキャストを実行できます。
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0]);
または、次のようにすることもできます。同じ結果を達成するには、昇格後にマスキング操作を適用します。
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU);
これらの手法に従うことで、printf が正確に実行されることを保証できます。単一バイトを扱う場合でも、16 進値を出力します。
以上がprintf を使用して 1 バイトの 16 進値を正確に出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。