byte[]
转换为长整型。我找到了一个在java.io.Bits
包中的函数byteArrayToLong(byte_array)
,但它在我的应用程序中无法正常工作。是否有其他可替代的函数?
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
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);
另外要记住,Java中的 long
类型长度为8字节。如果只需要4字节,则 int
类型已足够。
long val = (b[0] & 0xff) | ((b[1] & 0xff) << 8) | ((b[2] & 0xff) << 16) | ((b[3] & 0xff) << 24)
- Michele Bontorno有三个选项:
根据字节顺序,您可能需要反转数组。
当将长度小于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) 分配了8字节以存储long类型。
buffer = {0,0,0,0,0,0,0,0}
2. put(array) 将4个字节放入buffer中
buffer = {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}
^
|
byte[] input = new byte[]{1,0,0,0};
long value = byteArraytoByteBuffer(4,input).getInt();