- PR -

JAVAでdouble型をリトルエンディアンでバイナリに出力する方法

1
投稿者投稿内容
自分戦略
会議室デビュー日: 2009/02/04
投稿数: 8
投稿日時: 2009-02-04 09:23
JAVAでdouble型の情報をリトルエンディアンでバイナリとして出力する方法を教えてください。
現在、java.io.DataOutputStreamを使用し、writeDoubleで出力していますが、ビックエンディアンとしてしか無理でした。

読み込むのはテキスト型で出力がバイナリ。

現在のソースの簡易フローチャートを書いて置きます。

START

テキストファイルから特定の文字列を取得する(1 , 7 , 5.5等)

取得した文字列をそれぞれ対応の型に変換する
int top = Integer.parseInt("1");
int sub = Integer.parseInt("7");
double miks = Double.parseDouble("5.5");

バイナリのフォーマットに合わせて出力する
int型は4バイトでビックエンディアン。
double型は8バイトでリトルエンディアン。


例えば、デフォルトのビックエンディアンで出力した時、数字の1は
00 00 00 01 になりますが、

リトルエンディアンで出力した時は、
01 00 00 00 になると思います。

変換するタイミングとしては、書き込む時にオリジナル機能(メソッド)で書き込むデータ(int型やdouble型)とビックかリトルを指定して、バイナリに出来るものを探しています。

PS
現在の質問はソースを上げるのが一番とは思いますが、社外秘のソースなので、公開することは出来ません。

PPS
私の質問に対する質問があれば、より詳細に答えていくつもりです。


以上、宜しくお願い致します。

デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-04 09:40
某所で見かけただけで、未検証ですが

dataOutputStream.writeLong(Long.reverseBytes(Double.doubleToLongBits(d)))

という手があるみたいです。

だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2009-02-04 13:15
java.nio.ByteBufferでバイト配列にして出力というのでは?
buf.putInt(xx);
buf.order(ByteOrder.LITTLE_ENDIAN);
buf.putDouble(xx);
自分戦略
会議室デビュー日: 2009/02/04
投稿数: 8
投稿日時: 2009-02-04 13:53
返答ありがとうございます。

デューン 様>
一度Long型にして、Longとして出力と言う方式ですね。
確かにバイト数は同じなので、試してみる価値ありだと思います。

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

だっちょ 様>
実はそのByteBufferを今まで試していました。
しかし、bufのインスタンスを作る時に混乱してしまいまして。
そして、Byteに直す時になぜかStringになります。

5.5は数字だとちゃんとした結果になるのですが、String型だと 0025 . 0025 の文字コードになってしまい、行き詰っていました。

私のコーディング間違いがあるかもなので、もう一度試してみます。

ありがとうございました。
自分戦略
会議室デビュー日: 2009/02/04
投稿数: 8
投稿日時: 2009-02-04 15:15
デューン 様の方法で無事解決できました。

1000 のリトルとビック
E8 03 00 00 00 00 03 E8
と出力されました。

ここで、質問を閉めさせていただきます。
ありがとうございました。
1

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