在Java中将byte[]整洁地转换为long[]

4
我有一个字节数组需要重新打包成一个长整型数组。输入的字节数组大小未知(大约从0到几百个)。长整型数组需要右对齐,即最低索引长整型应填充零,其他所有长整型都应填满输入字节: (b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11) --> (xxxxb0b1b2b3, b4b5b6b7b8b9b10b11)
其中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;
    }

有没有更简洁的方式来完成这个任务?

请查看以下网址:https://dev59.com/sm855IYBdhLWcg3wMBPV - Ron Klein
1个回答

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);

ByteBuffer.wrap(inArr) 还更加简短。可能需要使用 order(LITTLE_ENDIAN)。但是,确实 ByteBuffer 是解决方案。 - Joop Eggen
是的,这样会更短,但它并不能解决整个问题,因为需要填充,你需要先有一个正确填充的字节数组。这就是我用两个 put()flip() 构建字节缓冲区的原因。关于顺序;默认的 BIG_ENDIAN 是正确的。 - Per Huss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接