我有一个8字节的数组,我想将其转换为相应的数值。
例如
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
我想要一种可以执行上述转换操作的方法。
我有一个8字节的数组,我想将其转换为相应的数值。
例如
byte[] by = new byte[8]; // the byte array is stored in 'by'
// CONVERSION OPERATION
// return the numeric value
我想要一种可以执行上述转换操作的方法。
new BigInteger(by).longValue()
Answers:
假设第一个字节是最低有效字节:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value += ((long) by[i] & 0xffL) << (8 * i);
}
第一个字节是最高位,然后略有不同:
long value = 0;
for (int i = 0; i < by.length; i++)
{
value = (value << 8) + (by[i] & 0xff);
}
如果您有8个以上的字节,请用BigInteger替换long 。
感谢Aaron Digulla纠正了我的错误。
value += ((long)by[i] & 0xffL) << (8 * i);
可以使用Buffer
作为的一部分提供的。java.nio
包的来执行转换。
在此,源byte[]
数组的长度为8,它的大小与一个long
值相对应。
首先, byte[]
数组包装在中ByteBuffer
,然后ByteBuffer.getLong
调用方法以获取long
值:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();
System.out.println(l);
结果
4
我要感谢dfa ByteBuffer.getLong
在评论中指出该方法。
尽管在这种情况下可能不适用,但Buffer
通过查看具有多个值的数组可以带来s 的魅力。
例如,如果我们有一个8字节的数组,并且希望将其视为两个int
值,则可以将byte[]
数组包装为ByteBuffer
,将其视为IntBuffer
然后通过IntBuffer.get
以下方式获取值:
ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);
System.out.println(i0);
System.out.println(i1);
结果:
1
4
如果这是一个8字节的数值,则可以尝试:
BigInteger n = new BigInteger(byteArray);
如果这是UTF-8字符缓冲区,则可以尝试:
BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));
简而言之,您可以使用或引用google提供的guava lib,它提供了在长数组和字节数组之间转换的实用方法。我的客户代码:
long content = 212000607777l;
byte[] numberByte = Longs.toByteArray(content);
logger.info(Longs.fromByteArray(numberByte));
您也可以将BigInteger用于可变长度的字节。您可以根据需要将其转换为Long,Integer或Short。
new BigInteger(bytes).intValue();
或表示极性:
new BigInteger(1, bytes).intValue();
往返于数组的所有原始类型的完整Java转换器代码 http://www.daniweb.com/code/snippet216874.html
数组中的每个单元均被视为unsigned int:
private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
return res;
for (int i=0;i<bytes.length;i++){
res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}