- ベストアンサー
【C言語】ファイルを読み込んで16進数で表示する
ファイルをバイナリモードで読み込んで16進数で表示するプログラムについて質問です。 以下の処理内容が理解できません。どのような処理を行っているのでしょうか?? (xdump.c)********************************* #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int i, j; FILE *fp; if(NULL == (fp = fopen(argv[1], "rb"))) { fprintf(stderr, "Cannot open FILE[%s].\n", argv[1]); exit(1); } for(i=0; i<0x7FFF; ++i) { printf("%08X :", ftell(fp)); for(j=0; j<16; ++j) { int c; c = 0x00FF & getc(fp); if(ferror(fp)) { puts("\a>>>> Read Error ! <<<<"); break; } if(feof(fp)) break; /* 16進数で表示 */ printf(" %2X", c); } printf(" : %08X\n", ftell(fp)-1); /* : */ /* : */ /* 以下省略 */ ****************************************** 上記に関して、 最初のfor文から"c = 0x00FF & getc(fp);"までの処理内容が よくわかりません。どなたかご教授願えますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> ftell(fp) > getc(fp); 標準関数については、関数のリファレンスを参照するとわかるかと思います。 > for(i=0; i<0x7FFF; ++i) { 0xで始まる数値は、16進数表記です。 例えば、16進数での 0x7fff を、10進数に直すと32767 ですね。 なので、 > for(i=0; i<0x7FFF; ++i) { 65535回ループ開始 は誤り、32767回ループと思われます。 > for(i=0; i<0x7FFF; ++i) はiが0から32767までの間、1つづ加算して、ループすると言う意味ですね。 > c = 0x00FF & getc(fp); の行ですが、16進数の 0x00ff と、getc(fp)が戻した結果を、&演算子をしようして、 ビットマスクしています。 &演算子 は、論理演算の場合に、論理積(AND)を求める演算子です。
その他の回答 (3)
- garaogu
- ベストアンサー率40% (67/166)
No.1です。 >> for(i=0; i<0x7FFF; ++i) { 65535回ループ開始 >は誤り、32767回ループと思われます。 Yanchさん、訂正ありがとうございます。 0xffffと思い込んでおりました。 masy0312さん、失礼しました。Yanchさんの書き込み通りです。
- php504
- ベストアンサー率42% (926/2160)
printf("%08X :", ftell(fp)); fpの位置(ファイル先頭からのバイト数)を16進数8桁で表示しています。 次のforループで16バイトずつ読んでいるので16ずつ増えるはずです。 00000000 :~ 00000010 :~ 00000020 :~ のように表示されると思います。 c = 0x00FF & getc(fp); これは無駄な処理のような気がします getc自体がunsigned charで読み込んでintにキャストするので c = getc(fp); でも問題ないはずです。
- garaogu
- ベストアンサー率40% (67/166)
こんばんは 以下のような説明で判りますでしょうか? for(i=0; i<0x7FFF; ++i) { 65535回ループ開始 printf("%08X :", ftell(fp)); ファイルポインタの位置を出力 for(j=0; j<16; ++j) { 16回ループ開始 int c; 変数 c の定義 c = 0x00FF & getc(fp); ファイルから1バイト取得。int c に格納するため、上位8ビットの無効化