• ベストアンサー

【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);"までの処理内容が よくわかりません。どなたかご教授願えますでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.3

> 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.4

No.1です。 >> for(i=0; i<0x7FFF; ++i) {    65535回ループ開始 >は誤り、32767回ループと思われます。 Yanchさん、訂正ありがとうございます。 0xffffと思い込んでおりました。 masy0312さん、失礼しました。Yanchさんの書き込み通りです。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

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)
回答No.1

こんばんは 以下のような説明で判りますでしょうか? 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ビットの無効化

関連するQ&A