バイナリファイルの中身を読み込むには?

解決


ヨシ  2006-09-09 01:12:50  No: 62962

初心者ですがよろしくお願いします。

現在、Viaual Studio.net 環境で、C++言語を使って開発をしていますが、
問題点が出てきたのでどなたかわかる方ご教授よろしくお願いします。

【やりたいこと】
バイナリファイル転送を行う。
その際、ファイルのヘッダ部から総バイト数を計算できるので、転送前にその数値を読み取りたい。
[ヘッダ部]
01 00 00 00 01 3E 0B C2 00 00 00 00 00 00 00 00

(a)5,6バイト目        01 3E(318)
(b)7,8バイト目        0B C2(3010)
今、必要な情報は(a)と(b)を10進数表記にした数値、つまり「318」「3010」
が欲しい情報です。
318*3010がデータ部の総バイト数になります。

[ソース]
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
if ((fi = fopen("hoge.hoge", "rb")) == NULL) {
  AfxMessageBox("Cannot open input  file");
  return;
}

int a = 0,b = 0,c = 0,d = 0;

fread(&charbuf, 1, 1, fi);
fread(&charbuf, 1, 1, fi);
fread(&charbuf, 1, 1, fi);
fread(&charbuf, 1, 1, fi);
fread(&charbuf, 1, 1, fi);
  a = (int)charbuf;        //ここで「01」を読み込む
fread(&charbuf, 1, 1, fi);
  b = (int)charbuf;        //ここで「3E」を読み込む
fread(&charbuf, 1, 1, fi);
  c = (int)charbuf;        //ここで「0B」を読み込む
fread(&charbuf, 1, 1, fi);
  d = (int)charbuf;        //ここで「C2」を読み込む

a*256+bの出力
c*256+dの出力
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

【現象】
a*256+b、c*256+dの出力を確認しました。
a*256+bは期待通りの数値318が出力されました。
しかし、c*256+dの出力2754となりました。。

そこで、cとdを各々出力させてみたところ、
c → 2816(問題なし)
d → -62 (問題あり)
となりました。

2816「0B」は問題ありません。
-62は「FFFFFFFFFFFFFFC2」でマイナスになっています。

何か原因は考えられるでしょうか。。

どなたか手助け宜しくお願いいたします。


Blue  2006-09-09 01:24:39  No: 62963

charbufはunsigned char型ではなくchar型ですか?


ヨシ  2006-09-09 01:26:32  No: 62964

返信ありがとうございます。

char charbuf;

です。


Blue  2006-09-09 01:31:35  No: 62965

>char charbuf;
だからです。

>fread(&charbuf, 1, 1, fi);
>d = (int)charbuf;        //ここで「C2」を読み込む
の時点で、charbufはマイナスの値なので、dもマイナスの値になります。

ですので、charbuf を unsinged char 型で宣言しておけば、
マイナスの値は、はいりません。

ちなみに、char型の値をint型に入れるとき、キャストはしなくてもいいです。


ヨシ  2006-09-09 01:36:03  No: 62966

今、試してみました。

うまくいきました!

こんなに早期解決するとは思いませんでした。
どうもありがとうございました。
追加のアドバイスもありがとうございます。

また質問させていただくかもしれませんが、宜しくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加