初心者ですがよろしくお願いします。
現在、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」でマイナスになっています。
何か原因は考えられるでしょうか。。
どなたか手助け宜しくお願いいたします。
charbufはunsigned char型ではなくchar型ですか?
返信ありがとうございます。
char charbuf;
です。
>char charbuf;
だからです。
>fread(&charbuf, 1, 1, fi);
>d = (int)charbuf; //ここで「C2」を読み込む
の時点で、charbufはマイナスの値なので、dもマイナスの値になります。
ですので、charbuf を unsinged char 型で宣言しておけば、
マイナスの値は、はいりません。
ちなみに、char型の値をint型に入れるとき、キャストはしなくてもいいです。
今、試してみました。
うまくいきました!
こんなに早期解決するとは思いませんでした。
どうもありがとうございました。
追加のアドバイスもありがとうございます。
また質問させていただくかもしれませんが、宜しくお願いいたします。
ツイート | ![]() |