2016-06-12 62 views
3

我有一个字节数组需要重新打包为一个long数组。输入字节数组的大小未知(大约从0到几百)。长阵列需要出来右对齐即最低索引long应该用零填充,所有其他应该填满输入字节: 。 (b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11)→(xxxxb0b1b2b3,b4b5b6b7b8b9b10b11)在java中将byte []转换为long []

其中b1,b2等是给定字节。 我有一个解决方案,但它不是很整齐或可读:

// outArr has length (inArr.length+7)/8 

for (int i = 0; i < inArr.length ; i++) {  
    outArr[outArr.length - i/8 - 1] |= ((long)inArr[inArr.length - i - 1]) << (i % 8) * 8; 
    } 

有没有这样做的不太丑陋的方式?

+0

请看看http://stackoverflow.com/questions/4485128/how-doi-i-转换长字节返回in-java –

回答

2

可能有更好的方法来做到这一点,但一种方法可能是使用java.nio缓冲区来转换它。由于需要将输入数组对齐到8个字节块,因此需要执行几个步骤:

int padding = outArr.length * 8 - inArr.length; 
ByteBuffer buffer = ByteBuffer.allocate(inArr.length + padding) 
           .put(new byte[padding]).put(inArr); 
buffer.flip(); 
buffer.asLongBuffer().get(outArr); 
+0

'ByteByffer.wrap(inArr)'还有点短。可能需要'order(LITTLE_ENDIAN)'。但确实ByteBuffer是解决方案。 –

+0

是的,这会更短,但由于需要填充,它不能解决_whole_问题,因为您需要首先正确填充字节数组。这就是我用两个'put()'和'flip()'构建字节缓冲区的方法。关于命令;默认的'BIG_ENDIAN'是正确的。 –