- ベストアンサー
Javaでのエンディアン変換
- Javaでのエンディアン変換をご教授ください。ファイルを読み込み、ソケット通信でサーバへデータ送信しています。リトルエンディアンで送らなければいけないのですが、Javaはビッグエンディアンでメモリに格納するとありました。バイトオーダーをしようと思い、バイナリファイルを作成して試しましたが、結果が同じでした。なぜでしょうか?
- Javaでのエンディアン変換について調べましたが、良く分かりません。リトルエンディアンとビッグエンディアンの違いや、バイトオーダーについて教えていただけませんか?データ型を意識せずに変換したいです。
- Javaでのエンディアン変換についてお教えいただけませんか?ファイルを読み込み、ソケット通信でサーバへデータ送信していますが、リトルエンディアンで送る必要があります。しかし、Javaはビッグエンディアンでメモリに格納するとあります。バイトオーダーを変更しようと試みましたが、結果が同じでした。どうすればリトルエンディアンで送ることができるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
書き忘れていたので追記します。 作成したバイナリファイルがサーバへ送信したい形式そのもの(リトルエンディアン)になっていて、Javaプログラム内ではそのデータ内容を一切解釈・操作する必要がない場合には、Javaプログラムでエンディアンを気にする必要はありません。 ファイルからbyteデータの並びとして読み込み、それをそのままbyteデータの並びとしてサーバへ送り出せばいいだけです。これならば、byteデータの並び順がJavaプログラムの中で変わってしまうことはありませんから。
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
エンディアンが意味を持つのは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 となります。
ByteBufferで違いがないのはちょっとよくわからないのですが……。これは、同じプログラム内ではなく、変換したデータを受け取った側で試してみて変化がない、ということでしょうか。ひょっとして、単純にgetした際にJVMがリトルエンディアンに戻して解釈してしまっている、ということはないでしょうか。単なる推測でよくはわからないのですが……。 また、別のアプローチですが、DataOutputStreamで出力する際、 stream.writeLong(Long.reverseBytes( long_value); こんな感じで1つ1つのlongをreverseBytesして出力したら、受け取る側はエンディアンが逆転した状態で受け取れないでしょうか。
お礼
お礼が遅くなりました。 ご教授ありがとうございました。 今回のInputファイルは他の回答者様の言う通り リトルなのでJavaでは意識しなくて良い という結論になりました。 ありがとうございました☆
お礼
お礼が遅くなりました。 ご教授ありがとうございました。 ご教授頂いた通り 今回のInputファイルは リトルなのでJavaでは意識しなくて良い という結論になりました。 また、型を意識しないエンディアン変換は出来ないことも分かりました。 ありがとうございました☆