
こんばんは☆
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
No.3ベストアンサー
- 回答日時:
書き忘れていたので追記します。
作成したバイナリファイルがサーバへ送信したい形式そのもの(リトルエンディアン)になっていて、Javaプログラム内ではそのデータ内容を一切解釈・操作する必要がない場合には、Javaプログラムでエンディアンを気にする必要はありません。
ファイルからbyteデータの並びとして読み込み、それをそのままbyteデータの並びとしてサーバへ送り出せばいいだけです。これならば、byteデータの並び順がJavaプログラムの中で変わってしまうことはありませんから。
お礼が遅くなりました。
ご教授ありがとうございました。
ご教授頂いた通り
今回のInputファイルは
リトルなのでJavaでは意識しなくて良い
という結論になりました。
また、型を意識しないエンディアン変換は出来ないことも分かりました。
ありがとうございました☆
No.2
- 回答日時:
エンディアンが意味を持つのは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 となります。
No.1
- 回答日時:
ByteBufferで違いがないのはちょっとよくわからないのですが……。
これは、同じプログラム内ではなく、変換したデータを受け取った側で試してみて変化がない、ということでしょうか。ひょっとして、単純にgetした際にJVMがリトルエンディアンに戻して解釈してしまっている、ということはないでしょうか。単なる推測でよくはわからないのですが……。また、別のアプローチですが、DataOutputStreamで出力する際、
stream.writeLong(Long.reverseBytes( long_value);
こんな感じで1つ1つのlongをreverseBytesして出力したら、受け取る側はエンディアンが逆転した状態で受け取れないでしょうか。
お礼が遅くなりました。
ご教授ありがとうございました。
今回のInputファイルは他の回答者様の言う通り
リトルなのでJavaでは意識しなくて良い
という結論になりました。
ありがとうございました☆
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- XML MSFormsとは何ですか? 2 2022/05/02 09:38
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
- Java java 入力された文字列を数値に置き換えて整数にし、計算をしたいです。 <を10として /を1とし 4 2022/05/16 21:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
プログラミング初心者です。プ...
-
画素値取得について
-
JavaScriptの実行速度が遅い
-
VBA バイナリ―から文字列にす...
-
EXCEL VBAでテキストファイルの...
-
Microsoft VBAで2GBを超えるフ...
-
ページ読み込み時に自動的にsub...
-
エラー:ストリームの終わりを...
-
HDDのバイナリイメージの取得方...
-
ビットマップファイル生成(C言...
-
C言語初心者の質問失礼します。
-
どんなプログラムを書いても指...
-
自民党が「高齢者の医療費負担...
-
VBAで他のプログラムが起動して...
-
FTPでputすると空ファイルが出...
-
教えてください!vectorworksに...
-
Access クエリ実行が急に非常に...
-
GetPrivateProfileStringでini...
-
VB.NETで他のプロジェクトで作...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
VBA バイナリ―から文字列にす...
-
エラー:ストリームの終わりを...
-
ページ読み込み時に自動的にsub...
-
EOF
-
エクセルVBA 2千万行のCSVファ...
-
入力ファイルをバイナリにする利点
-
【Teraterm】filewritelnについて
-
【python】Excelファイルを読み...
-
EXCEL VBAで、バイナリデータの...
-
FTPでエクセルをPUTするとファ...
-
テキストデータをSQLServerに取...
-
C言語とシリアル通信の送受信...
-
ビットマップファイル生成(C言...
-
pcxファイルを開きたい(RGBデ...
-
FTPを使わないファイルアップロ...
-
MacからWinにファイルを添付す...
-
HDDのバイナリイメージの取得方...
おすすめ情報