質問
私はJavaでいくつかのバイトをひっくり返そうとしていますが、私が持っている機能はいくつかのバイトのために正しく機能し、他のバイトのために失敗しています。
私が使用している機能はこれです:
public static int foldInByte(int m, int pos, byte b) {
int tempInt = (b << (pos * 8));
tempInt = tempInt & (0x000000ff << (pos * 8));
m = m | tempInt;
return m;
}
これを実装するコードは次のとおりです。
byte[] bitMaskArray = new byte[]{
byteBuffer.get(inputIndex),
byteBuffer.get(inputIndex + 1),
byteBuffer.get(inputIndex + 2),
byteBuffer.get(inputIndex + 3)};
int tempInt = 0;
tempInt = foldInByte(0, 3, bitMaskArray[3]);
tempInt = foldInByte(tempInt, 2, bitMaskArray[2]);
tempInt = foldInByte(tempInt, 1, bitMaskArray[1]);
tempInt = foldInByte(tempInt, 0, bitMaskArray[0]);
bitMask = tempInt;
バイトはバイトバッファから読み取られており、バイトオーダーは小さなエンディアンです。
たとえば、バイト00 01 B6 02ビットマスクを次のように設定します。2B60100-これは私のプログラムで完全に機能します。
ただし、バイトがA0 01 30 00の場合、ビットマスクは次のように設定されています。3001A0-ビットマスクから最後のゼロを沈めました。
Javaが後続のZerosを排除するのを止める方法はありますか?
それが理にかなっていることを願っています。
ありがとう
トニー
解決
ゼロは剥がされていません - 引用された両方の例は正しいです。
- 00 01 B6 02は2B60100の4バイトの小さなエンディアンです
- A0 01 30 00は3001A0の4バイトの小さなエンディアンです
ゼロはそこにありますが、おそらく印刷されていないだけです。 System.out.printファミリの呼び出しは、ゼロの先頭の数字を印刷しません。
あなたの方法は不必要に複雑であることに言及するかもしれません。以下は、同じ値を計算する単一の方法です。
static int extractLittleEndian4(byte[] buf, int index)
{
int a = buf[index+0]&0xff, b = buf[index+1]&0xff, c = buf[index+2]&0xff, d = buf[index+3]&0xff;
return a | (b << 8) | (c << 16) | (d << 24);
}
他のヒント
すでにバイトで満たされたByteBufferがあるようです。 Bytebufferをバイトを逆にさせてみませんか?バッファにバイトを追加するだけ(バイトではなく整数を追加する場合はBIG_ENDIANがデフォルトです)。整数を読む前に順序を変更します。
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
int output = byteBuffer.getInt(0);
あなたがしているのがバイトの順序を逆にすることだけなら、図書館にあなたのために仕事をさせてください。整数値から始めた場合は、これを行うこともできます。
int input = ...;
int output = Integer.reverseBytes(input);
所属していません StackOverflow