今、私はバイナリファイルから数値を読み取る必要があるプログラムを持っています.数値はリトルエンディアンであり、Javaコードのビッグエンディアンに変換する必要があります.何も取得していません.よろしくお願いします。
5 に答える
nio と a を使用して読んでByteBuffer
ください.order(ByteOrder.LITTLE_ENDIAN)
。
Guava はベータ版をサポートしているようです。
これまでのところ良い答えですが、最近はJavaよりも.NETに多くの時間を費やしていることを認めなければなりません。
ただし、他の人がここで行った回答と同様に、実際には、リトルエンディアンとビッグエンディアンの違いを説明する回答を投稿する価値があると感じました。
多くの場合、このような質問を目にすると、実装に5分もかからない非常に単純なタスクであることに人々は気づきません。
エンディアンとは、特定の数値のバイトが実際にバイナリファイルに格納される順序に関するものです。
16ビットの「短整数」(これによって影響を受ける可能性のある最小サイズ)の簡単な例を見てみましょう。
これを「バイト」の観点から考えるのをやめると、16ビットが実際には2バイトに等しいことがすぐにわかります。
ここで、これらのバイトを最低次と最高次に分解し始めると、実際には低次バイトと高次バイトが得られます。
想像すると、値511があり、これは2バイトの
1
と
256
なぜ?
数値のビット位置は2の累乗です。右から左に、2の累乗のビットを調べると、次のようになります。
128 64 32 16 8 4 2 1
これらの列をすべて合計すると、取得できる最大値は255であることがわかります。
すべてのビットがいっぱいになったら、次のビットに移動する必要があるため、511を取得するには次のビットが必要です。
256 128 64 32 16 8 4 2 1
これは、バイトに分割することにより、実際には次のようになります。
1 | 128 64 32 16 8 4 2 1
と| 2つの8ビットバイト間の分割を表す文字。
またはグラフィカル形式
-------------
| 1 | 255 |
-------------
Binaryについて深く掘り下げるつもりはありません。さもないと、トピックから外れてしまいますが、ウィキペディアには次のようなまともな参照がたくさんあります。
http://en.wikipedia.org/wiki/Binary_number
バイトに戻る...
これらのバイトをファイルに書き込むときは、1を書き込んでから255を書き込むか、255を書き込んでから1を書き込むことができます。
最初に1を書き込む場合、2バイトの最大(最大)値を最初に書き込むため、これは「ビッグエンディアン」と呼ばれます。
最初に255を書き込む場合は、2つの値の最小(下)を最初に書き込むため、「リトルエンディアン」という名前が付けられます。
どのように一方から他方に変換しますか?
値が「リトルエンディアン」値としてファイルに保存されている場合は、基本的に次のことを行う必要があります。
Read One Byte into A
Read One Byte into B
Make 16 bit Result = (B << 8) + A
「ビッグエンディアン」値としてファイルに保存されている場合
Read One Byte into A
Read One Byte into B
Make 16 bit Result = (A << 8) + B
他の数値タイプも同様に単純で、通常の32ビット整数を取ります...
分解すると、4、8ビットバイトになります
-----------------
| 4 | 3 | 2 | 1 |
-----------------
1が最低で、4が最高です。
「リトルエンディアン」では、バイトは次のようにファイルに保存されます。
-----------------
| 1 | 2 | 3 | 4 |
-----------------
それを読み戻すには:
Read One Byte into A
Read One Byte into B
Read One Byte into C
Read One Byte into D
Make 32 bit Result = (D << 24) + (C << 16) + (B << 8) + A
および「ビッグエンディアン」:
-----------------
| 4 | 3 | 2 | 1 |
-----------------
それを読み戻すには:
Read One Byte into A
Read One Byte into B
Read One Byte into C
Read One Byte into D
Make 32 bit Result = (A << 24) + (B << 16) + (C << 8) + D
ご覧のとおり、個々のバイトの読み取り方法(任意の言語)を知っている限り、追加のルーチンやライブラリ呼び出しは実際には必要ありません。必要なのは、少し左にシフトすることだけです...
そして好奇心旺盛な人のために:
32ビット整数を次のように記述します
「リトルエンディアン」:
Make R = 32 bit integer to store
Make 8 bit Value A = R AND 255
Make 8 bit Value B = (R >> 8) AND 255
Make 8 bit Value C = (R >> 16) AND 255
Make 8 bit Value D = (R >> 24) AND 255
Write A as byte to file
Write B as byte to file
Write C as byte to file
Write D as byte to file
「ビッグエンディアン」:
Make R = 32 bit integer to store
Make 8 bit Value A = R AND 255
Make 8 bit Value B = (R >> 8) AND 255
Make 8 bit Value C = (R >> 16) AND 255
Make 8 bit Value D = (R >> 24) AND 255
Write D as byte to file
Write C as byte to file
Write B as byte to file
Write A as byte to file
何年も前から、Appache commons には LittleEndianInputStream があります。