在Java中将long [64]转换为byte [512]?

Cor*_*urn 16 java porting

我正在将进程移植到Java.已经有了C#和C++的工作版本.

我在C#中有一个部分,我使用Marshal.Copy(...)将64个字节转换为512个字节,并在C++中使用memmove(...)来执行相同的操作.Java中有哪些可以实现相同的结果?我需要相同顺序的二进制信息,就像字节而不是long一样.

编辑:

我移植到Java的原因是利用Java自然具有的可移植性.我不想使用本机代码.

另一件事.由于Java不包含无符号值,因此我需要稍微更改我正在请求的内容.我想从64个long(C#和C++中的ulongs)中的每一个获得8个无符号字节值,以便稍后我可以在数组中的索引处使用这些值.这需要发生数千次,因此最快的方式将是最好的方式.

tra*_*god 20

ByteBuffer适用于此:只需输入64个long值,然后byte[]使用该array()方法.本ByteOrder类可以有效地处理端的问题.例如,结合wierob评论中建议的方法:

private static byte[] xform(long[] la, ByteOrder order) {
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8);
    bb.order(order);
    bb.asLongBuffer().put(la);
    return bb.array();
}
Run Code Online (Sandbox Code Playgroud)

附录:生成的byte[]组件是有符号的8位值,但Java数组需要非负整数索引值.将a byte转换为int将导致符号扩展,但屏蔽高阶位将给出无符号值byte b:

int i = (int) b & 0xFF;
Run Code Online (Sandbox Code Playgroud)

答案详细说明了适用的运算符优先级规则.这个相关的答案展示了类似的double价值观方法.