• ベストアンサー

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

お世話になっています。 今、バイナリファイル(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にならなければいけないのですが・・・。これは、どのように解決すればいいのでしょうか? 部分的に間違っている。根本的に間違っている。などなど アドバイスよろしくお願いします。

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.1

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

hamu-september
質問者

補足

さっそくありがとうございます。 >・2バイトの浮動小数点ってあるのですか? >・浮動小数点の float、double が使えないって何? 2バイトの浮動小数点はないです。ただ、floatやdoubleは4バイト以上なので今回は使用できないっていう意味でした。 >・仮数部、指数部のビット長はどうなるのですか? これについては、ちょっと分からないです。すいません。 >・そして、リトル・エンディアンで記録すると最下位のバイトから順番に0xC2、0xFF とバイナリファイルに書き込まれます。 >・1ワードの(-62)は16進数では、0xFFC2 になります。 エンディアンという考え方を恥ずかしいことに今知りました。 たしかに、上記の問題はエンディアンで考えると納得しますね。 >・本当に2バイトの浮動小数点なのですか? >・私は、ワード型(16Bit)の整数値の配列だと思いますが…。 言われて見れば、浮動小数点ではおかしい部分が多い過ぎますね。 そのファイルに関するHPを見ていて、浮動小数点を使っているという記述があったので、それを見て早とちりしてしまったようです。。。 そこで、ファイルがリトル・エディアンで書かれているかどうかを確認したいのですが、 どのようにプログラムを書けばいいのでしょうか? よろしくお願いします。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.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
hamu-september
質問者

お礼

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

  • ballville
  • ベストアンサー率47% (233/487)
回答No.2

charでなく、signed shortで読めばいいのでは? 0xFFC2は-62ですから。 たぶん、エンディアンを失念しておられるのでは? というわけで、そのバイナリファイルは整数しかないと思います。

hamu-september
質問者

お礼

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

関連するQ&A

  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

  • 浮動小数点:エクセス64について

    浮動小数点を表現するエクセス64で表現されている8バイトの実数である以下の2つがあるのですが、 40 19 99 99 99 99 99 9a (16進) 41 18 00 00 00 00 00 00 (16進) それぞれ0.1と1.5らしいのですが小数点以下の部分のエクセス64での表現がよくわかりません。 どなたか解説をしていただける方はいらっしゃいますでしょうか。 よろしくお願いいたします。

  • 浮動小数点は 0 含まれますか

    0 は整数 integer ですが、 浮動小数点でもありますか? 0.00000 は浮動小数点ですか?

    • ベストアンサー
    • PHP
  • バイナリから実数を取得したいのですが・・・

    C++にてバイナリデータから倍精度の浮動小数を取得したいと考えています。 バイナリの中にリトルエンディアン形式で倍精度の浮動小数が64ビット幅に収められています。 これをdouble型の変数に代入したいのですが、どうすれば(できれば簡単な方法で)値を代入できるでしょうか? ご教授お願いします。 データのサンプルを念のために記載させて頂きます。 B2 9C 05 DA 7D 40 6C 3F -> 3.448720745086919e-3

  • バイナリ表示されたデータを小数にかえるには?

    こんばんわ, 今,ある参考書のファイルで 「0000 1010 1010 1010 1010 1010 1010」 という28ビットのバイナリーデータが小数部分をあらわすとき,それをfloat,もしくはdouble型のxに変換せよ。 という,問題があるのですが,1つ1つ上位ビットから0.5×0+0.25×0+・・・とやっていく方法以外にビット演算子やシフト演算子,関数を使用して簡単にできる方法がありましたら教えてください。 ちなみにC言語で作成しています(データはBIGもしくはLITTLEエンディアンどちらの方法でもかまいません)。

  • 浮動小数点から文字列の変換の時に

    浮動小数点floatからStrへの変換をgcvt関数で行なうときに、値が小さいと文字列0.00005が欲しいのに5e-05になってしまいます。 どうすればよいですか?教えてください。

  • ファイル入出力時の、異なる変数型の扱い

    実数型、整数型、文字型が入り組んだファイルがあったとします。 例えば、 1 0.01 kok 2 . 45 . 0.254 lp 6 12.54 . このとき、このファイルを読み込んで、 第2列(縦列)のある値が実数ならvectorに格納し、 そうでないなら、何もしないというようなプログラムを 作りたいと思っています。 どのようにすればよいでしょうか。 ただし、各列(縦列)は、文字型、整数型、実数型のどれが入っているかは 分かりませんが、何バイトかは分かっているとします。

  • バイナリデータからの値の取得について教えてください

    今、バイナリデータから値を取りだそうとがんばっています。 しかし、うまくいかずに困っています。 困っていることは2点あります。 (1)バイナリデータにはリトルエンディアンで格納していると書いています。 まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? (2)バイナリデータには、 はじめに文字列(char)型4バイトで「RIFF]という値 次に32ビット符号なし整数で4バイトの数字、 次に4052バイトの構造体 などと収納されているようです。 このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? 全然できなくて困っています。 教えていただけないでしょうか? よろしくお願いいたします。

  • 浮動小数点について

    独学でプログラミングの勉強をしています。Wiki等で調べたりしましたが、 下記テキストの質問の計算が全く分かりません。 分かりやすく説明して頂けるとありがたいです。 宜しくお願い致します。 質問: 二つの浮動小数点の数字があり、SEEMMMM(S=符号付数値、E=指数、M=仮数)の形式で表示されています。 指数はエクセス数50、仮数は符号付数値、小数点は右の仮数に表示されます。 0 53 1110 0 50 3020 二つの数字を加算し、正しく表示された浮動小数点形式と実数をすべての計算式も含め表しなさい。

  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

専門家に質問してみよう