問題の説明:プログラミング プロセス中に、ファイル (形式は次の図 1 に示されています) から 16 進形式でデータを読み取り、それをメモリ (char buf [MAX_SIZE]) に保存する必要があるという要件に遭遇しました。ただし、読み取りデータをテストし、printf("%02x",buf); を使用してデータを出力すると、奇妙な問題が発生しました: 各バイトの上位 4 ビットの値が 8 より大きい場合は常に、このバイトが出力されます。値の前にあると、複数の ffffff が突然偽装されます (結果については図 2 を参照)。
図1 入力ファイルのデータ形式
図2 出力データフォーマット
図 1 と図 2 を比較すると、上位 4 ビット値が 8 より大きい場合、各バイトの前にさらにいくつかの f があることがわかります。
私の出力コードは次のとおりです。
int rsize;
char buf[MAX_SIZE]; //问题的始作俑者*****
rsize = fread(buf,sizeof(char),filesize,fp);
if (rsize < 0)
{
printf("Failed to read file .\n");
}
buf[rsize] = '\0';
int i ;
for ( i = 0; i < rsize; ++i)
{
if ((i%16) == 0 )
{
printf("\n");
}
printf("%02x ",buf[i]);
}
この出現の原因は何ですか? printf を使用して文字列を 16 進数形式で出力する場合、歪んだ結果については ここで説明しますが、要するに、出力時に printf("%02x",buf); がオーバーフローするということです。データを格納するbufをunsigned char buf[MAX_SIZE)に変更すると問題は解決します。