- PR -

C言語で作成したバイナリファイルを読み込むには

1
投稿者投稿内容
ニセ青年
会議室デビュー日: 2004/05/04
投稿数: 5
投稿日時: 2004-07-23 09:31
C言語で作成された、バイナリファイルを出力する
プログラムがあります。このバイナリファイルを
javaで読み込むにはどうしたらよいのでしょうか?
ここで言うバイナリファイルは、int型、float型などの
プリミティブな型をバイナリで出力したものです。
特に知りたいのは、float型とdouble型の入力方法です。
C言語の処理系は、できれば限定したくないのですが、
Windowsとlinux(共にx86系)を想定しています。

MMX
ぬし
会議室デビュー日: 2001/10/26
投稿数: 861
投稿日時: 2004-07-23 10:13
>C言語の処理系は、できれば限定したくないのですが、
Windowsとlinux(共にx86系)を想定しています。
「JavaプログラマーのためのC言語入門」
http://joan.javaopen.org/jfriends/cforjava/
正確には「限定」しないとダメです、エンディアンはリトルかな、
とりあえず、バイナリをダンプを
比較(C出力とJava出力)してみましょう。
Floatの 1.0 はどうなっているか
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2004-07-23 10:27
質問の内容には、ちょっと違和感があったりするんですが。
とりあえず、いってみましょう。
引用:

ニセ青年さんの書き込み (2004-07-23 09:31) より:
C言語で作成された、バイナリファイルを出力する
プログラムがあります。このバイナリファイルを
javaで読み込むにはどうしたらよいのでしょうか?


バイナリファイルの読み込みには、java.io.FileInputStreamという
クラスを利用します。
引用:

ここで言うバイナリファイルは、int型、float型などの
プリミティブな型をバイナリで出力したものです。


ここまではいいのですが。
引用:

特に知りたいのは、float型とdouble型の入力方法です。
C言語の処理系は、できれば限定したくないのですが、
Windowsとlinux(共にx86系)を想定しています。


プログラムが出力したデータがバイナリである以上、
そこから元のデータを復元するには、
そのプログラムの出力動作を逆にたどる必要があります。

そのアルゴリズムがちゃんとわかっているのなら、
読み込んだバイナリから、対象となるデータを抽出して、
int型やfloat型に復元するプログラムを作成することは可能でしょう。
いずれにせよ、処理系や言語はともかく、
バイナリの生成に利用されたアルゴリズムは必須事項かと。

ひょっとしたら、すごく簡単にできるのかもしれませんが、
その場合でも、アルゴリズムに依存していることには変わりありません。

<追記>
む、一般論になり過ぎちゃいましたかな。(- -;

[ メッセージ編集済み 編集者: Edosson 編集日時 2004-07-23 10:32 ]
お犬様
ベテラン
会議室デビュー日: 2003/01/26
投稿数: 67
投稿日時: 2004-07-23 14:10
C言語の仕様では int や float のサイズは実装依存だったと思いますので MMXさんが既に書いている通り処理系は限定するか、もしくは C言語の出力処理を、どの処理系でも必ず同じ出力になるように書き換えなければなりません。

浮動小数点数の入力に関しては、お使いの処理系もしくはプログラムの float のサイズが Java の float と同じか確かめてからになりますが、これらが同じだと仮定すれば、エンディアンに気をつけて int で読み込み、java.lang.Float#intBitsToFloat(int)を使用して int から float に変換すればよいはずです。double の場合は long で読み込み、java.lang.Double#longBitsToDouble(long) を使用して long から double に変換します。更にエンディアンも同じだと仮定できれば
java.io.DataInputStream#readFloat()java.io.DataInputStream#readDouble() で読み込む事もできます。
ニセ青年
会議室デビュー日: 2004/05/04
投稿数: 5
投稿日時: 2004-07-23 22:46
早速のレス、ありがとうございます。

>Edosson様
最初の書き込みの補足をまず申し上げます。
C言語(正確にはC++言語)でバイナリにオープンした後に
write関数を用いてfloat型の変数を出力しております。
具体例は下のとおりです。
ofstream ost( ios::binary );
float f = 1.0;
ost.write((char *)&f, sizeof(float));
このwrite関数のアルゴリズムが分かれば
私にもうまくこの問題が解決できたのですが、
勉強不足でよく分かりませんでした。

>MMX様
>お犬様様(^^;
結論から申しますと、皆様のご助言により
私の希望が叶いました。
方法としては、まずMMX様のご助言により
バイナリエディタでファイルの中身を調べた上で、
バイトの並びを確認し、
お犬様様のご助言によりintBitsToFloatを使用して
うまくfloat型に変換することができました。
大変ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)