みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

バイナリファイルの読込み(小数の扱いについて)

お世話になっています。

今、バイナリファイル(BSQフォーマット)を読み込むプログラムをC言語で書こうとしています。バイナリファイルの内容は数字(実数)の配列です。
そのバイナリファイルは、1数字につき2バイトしかなく、浮動小数点(float4バイトとdouble8バイト)などが使えませんでした。
なので、固定小数点なのかと思い、1バイトずつcharで読み込んだところ整数部分だけうまく読み込めました。しかし小数部分がうまくいきませんでした。
バイナリエディタで見たところ以下のようになっていました。
例:C2 FF(or 00) (この値が-62になることは分かっています。)
しかし、上記の方法で読み込んだ結果は-62 -1でした。

そこで質問なのですが、
(1)2バイトの実数を1バイトで区切って整数と小数に分けて行うことなどあるのでしょうか?
(2)上記の方法で行った場合、FFが-1になり、00も-1になってしまいます。本来なら小数部分のFFも00も値は0にならなければいけないのですが・・・。これは、どのように解決すればいいのでしょうか?

部分的に間違っている。根本的に間違っている。などなど
アドバイスよろしくお願いします。

投稿日時 - 2007-01-05 10:02:01

QNo.2644043

困ってます

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

★補足要求
・2バイトの浮動小数点ってあるのですか?
・仮数部、指数部のビット長はどうなるのですか?
・浮動小数点の float、double が使えないって何?
・1ワードの(-62)は16進数では、0xFFC2 になります。
・そして、リトル・エンディアンで記録すると最下位のバイトから順番に
 0xC2、0xFF とバイナリファイルに書き込まれます。
・本当に2バイトの浮動小数点なのですか?
・私は、ワード型(16Bit)の整数値の配列だと思いますが…。
・以上。補足要求します。

投稿日時 - 2007-01-05 10:13:42

補足

さっそくありがとうございます。

>・2バイトの浮動小数点ってあるのですか?
>・浮動小数点の float、double が使えないって何?
2バイトの浮動小数点はないです。ただ、floatやdoubleは4バイト以上なので今回は使用できないっていう意味でした。

>・仮数部、指数部のビット長はどうなるのですか?
これについては、ちょっと分からないです。すいません。

>・そして、リトル・エンディアンで記録すると最下位のバイトから順番に0xC2、0xFF とバイナリファイルに書き込まれます。
>・1ワードの(-62)は16進数では、0xFFC2 になります。
エンディアンという考え方を恥ずかしいことに今知りました。
たしかに、上記の問題はエンディアンで考えると納得しますね。

>・本当に2バイトの浮動小数点なのですか?
>・私は、ワード型(16Bit)の整数値の配列だと思いますが…。
言われて見れば、浮動小数点ではおかしい部分が多い過ぎますね。
そのファイルに関するHPを見ていて、浮動小数点を使っているという記述があったので、それを見て早とちりしてしまったようです。。。

そこで、ファイルがリトル・エディアンで書かれているかどうかを確認したいのですが、
どのようにプログラムを書けばいいのでしょうか?
よろしくお願いします。

投稿日時 - 2007-01-05 10:26:14

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

★アドバイス
・『リトル・エディアン』とか『ビッグ・エディアン』は CPU の種類で
 決まっています。
・『Intel』系の CPU のパソコンでは『リトル・エディアン』方式で、
 『Motorola』系の CPU のパソコンでは『ビッグ・エディアン』になります。
・プログラムから判定したい場合は、『0x1234』という整数をファイルに
 書き込み、『char』型で1バイトずつ読み込みます。
・『0x12』→『0x34』と読み込んだら『ビッグ・エディアン』方式で
 『0x34』→『0x12』と読み込んだら『リトル・エディアン』方式になります。
・『浮動小数点』は『仮数部』、『指数部』のビット長があって全体で
 32ビットならば『float』型で、64ビットならば『double』型になります。
・以上。おわり。

参考URL:http://ertl.jp/~takayuki/readings/info/no05.html

投稿日時 - 2007-01-05 13:03:31

お礼

大変参考になりました。
ありがとうございました。

投稿日時 - 2007-01-16 23:56:15

ANo.2

charでなく、signed shortで読めばいいのでは?
0xFFC2は-62ですから。
たぶん、エンディアンを失念しておられるのでは?

というわけで、そのバイナリファイルは整数しかないと思います。

投稿日時 - 2007-01-05 10:17:49

お礼

signed shortで無事読み込むことができました。
エンディアンという考え方をまったく知らなかったことと、小数が入っていると思い込んでいたのがダメだったようですね。

ありがとうございました。

投稿日時 - 2007-01-05 11:07:50

あなたにオススメの質問