プロが教える店舗&オフィスのセキュリティ対策術

こんばんは☆

Javaでのエンディアン変換をご教授ください。

ファイルを読み込み、ソケット通信でサーバへデータ送信しています。
リトルエンディアンで送らなければいけないのですが、
Javaはプラットフォーム問わずにビッグエンディアンでメモリに格納するとありました。

そこで、バイトオーダーをしようと思い、
stirlingというバイナリエディタでバイナリファイルを作成して以下の2点で試しました。

<バイナリファイル構造体>
struct stest {
LONG l1;
LONG l2;
LONG l3;
LONG l4;
};
<バイナリデータ(数値)>
1234
(010000020000030000040000)←バイナリエディタで見たとき


<テスト1結果>
・・・new InputStreamReader(in, "UnicodeLittle");
>1000200030004000

<テスト2結果>
ByteBuffer buffer = ByteBuffer.wrap(bt);
buffer.order(ByteOrder.LITTLE_ENDIAN);
buffer.get();
>1000200030004000

これはリトルエンディアンなのでしょうか?
どちらも、
Javaで読み込み時にエンディアン指定しない時と出力結果に違いがありませんでした。
なぜでしょうか?

ちなみに、データ型を意識せずに変換したいです。

色々と調べたのですが、良く分かりません。
どなたかご教授お願いいたしますm(_ _)m

A 回答 (3件)

書き忘れていたので追記します。


作成したバイナリファイルがサーバへ送信したい形式そのもの(リトルエンディアン)になっていて、Javaプログラム内ではそのデータ内容を一切解釈・操作する必要がない場合には、Javaプログラムでエンディアンを気にする必要はありません。
ファイルからbyteデータの並びとして読み込み、それをそのままbyteデータの並びとしてサーバへ送り出せばいいだけです。これならば、byteデータの並び順がJavaプログラムの中で変わってしまうことはありませんから。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。

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

ご教授頂いた通り
今回のInputファイルは
リトルなのでJavaでは意識しなくて良い
という結論になりました。

また、型を意識しないエンディアン変換は出来ないことも分かりました。
ありがとうございました☆

お礼日時:2011/05/13 17:07

エンディアンが意味を持つのは2バイト以上の長さのデータ型に対してだけなので、ByteBuffer.get()で1バイトずつ読み込む際にはエンディアン指定は役に立ちません。

4バイト長の整数を読み込むならエンディアン指定をした上でgetInt()を使わないと。

また、InputSteamReaderはテキスト(文字列)を読み込むためのものなので、バイナリデータを読む用途には合っていません。

> ちなみに、データ型を意識せずに変換したいです。

それは無理です。ファイルにあるデータが2バイト整数なのか4バイト整数なのか(あるいはそれ以外のデータ型なのか)によって、エンディアン反転操作は変わりますから。
ファイルにあるデータが先頭から 23 01 67 45 だった場合、これを2バイト整数2つと解釈すればエンディアン反転した結果は 01 23 45 67 ですが、4バイト整数1つと解釈した場合の結果は 45 67 01 23 となります。
    • good
    • 0

ByteBufferで違いがないのはちょっとよくわからないのですが……。

これは、同じプログラム内ではなく、変換したデータを受け取った側で試してみて変化がない、ということでしょうか。ひょっとして、単純にgetした際にJVMがリトルエンディアンに戻して解釈してしまっている、ということはないでしょうか。単なる推測でよくはわからないのですが……。

また、別のアプローチですが、DataOutputStreamで出力する際、

stream.writeLong(Long.reverseBytes( long_value);

こんな感じで1つ1つのlongをreverseBytesして出力したら、受け取る側はエンディアンが逆転した状態で受け取れないでしょうか。
    • good
    • 0
この回答へのお礼

お礼が遅くなりました。

ご教授ありがとうございました。
今回のInputファイルは他の回答者様の言う通り
リトルなのでJavaでは意識しなくて良い
という結論になりました。

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

お礼日時:2011/05/13 17:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!