byte[]
サイズ4のをAndroidアプリ用にlongと入力するように変換する必要があります。パッケージに含まれている関数を見つけましたが、アプリケーションで機能していませbyteArrayToLong(byte_array)
ん。java.io.Bits
他に代替機能はありますか?
使用java.nio.ByteBuffer
:
byte[] data = new byte[] {50, -106, 40, -22};
ByteBuffer buffer = ByteBuffer.wrap(data);
System.out.println(buffer.getLong());
もちろん、@Kaitoは正しいです。代わりに8バイトの配列が必要です。また、他の人が述べたように、バイトが読み取られる順序を選択できます(BIG_ENDIAN
デフォルト)。
byte[] data = new byte[] {50, -106, 40, -22, 0, 0, 0, 0};
ByteBuffer buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.BIG_ENDIAN);
System.out.println(buffer.getLong()); // 3645145933890453504
buffer = ByteBuffer.wrap(data);
buffer.order(ByteOrder.LITTLE_ENDIAN);
System.out.println(buffer.getLong()); // 3928528434
また、なぜAPIメソッドを好むのですか?簡単にするために、ビット単位のシフトでバイトからロングへの変換を認識する代わりに、ここで何が起こるかを平易な英語で読むことができます。
答えは、最初のバイトが最下位バイトか最上位バイトかによって異なります。
最初のバイトが最も重要な場合:
long val = 0;
for (int i = 0; i < YourByte.length; i++)
{
val = (val << 8) + (YourByte[i] & 0xff);
}
最初のバイトが最下位バイトの場合:
long val = 0;
for (int i = 0; i < YourByte.length; i++)
{
val += ((long) YourByte[i] & 0xffL) << (i*8);
}
編集:
8バイトを超える場合BigInteger
は代わりに使用してください。long
医者の答えはうまくいきますが、私はそれをループなしでやります。
リトルエンディアンの場合(最も可能性の高いケース):
long val = b[0] | ((int)(b[1]) << 8) | ((int)(b[2]) << 16) | ((int)(b[3]) << 24);
ビッグエンディアンの場合:
long val = b[3] | ((int)(b[2]) << 8) | ((int)(b[1]) << 16) | ((int)(b[0]) << 24);
また、Javalong
の長さは8バイトであることに注意してください。4バイトの場合、anint
で十分です。
3つのオプションが思い浮かびます。
エンディアンによっては、配列を逆にする必要がある場合があります。
サイズが8バイト未満のbyte[]をlong型に変換する場合
public static ByteBuffer byteArraytoByteBuffer(int capacity,byte[] array)
{
ByteBuffer buffer = ByteBuffer.allocate(capacity).put(array).order(ByteOrder.LITTLE_ENDIAN);
buffer.rewind();
return buffer;
}
それから
byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(8,input).getLong();
1. ByteBuffer.allocate(capacity)は、long型に8バイトを割り当てます。
バッファ={0,0,0,0,0,0,0,0}
2. put(array)は4バイトを配置します
バッファ={1,0,0,0,0,0,0,0}
^
|
現在、バッファの位置は4です。
3.バイトオーダーは、要件に基づいてLITTLE_ENDIANまたはBIG_ENDIANになります。
4. buffer.rewind()バッファを巻き戻し、位置をゼロに設定します。
バッファ={1,0,0,0,0,0,0,0}
^
|
buffer.rewind()操作が行われない場合、バッファアンダーフローが発生します。位置が4であるため、getLong()が呼び出されると、開始インデックスが4になります。
同じコードを使用してbyte[]をintに変換できます
byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(4,input).getInt();