我正在将进程移植到Java。已经有了C#和C ++中的工作版本。
我在C#中有一个部分我使用Marshal.Copy(...)将64个字节转换为512字节,而C ++中的那行我使用memmove(...)来做同样的事情。 Java中有哪些可以实现相同的结果?我需要相同顺序的二进制信息,就像字节而不是长字一样。
编辑:
我移植到Java的原因是利用Java自然具有的可移植性。我不想使用本机代码。
另一件事。由于Java不包含无符号值,因此我需要稍微更改我正在请求的内容。我想从64个long(C#和C ++中的ulongs)中的每一个获得8个无符号字节值,以便稍后我可以在数组中的索引处使用这些值。这需要发生数千次,因此最快的方式将是最佳方式。
答案 0 :(得分: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();
}
附录:生成的byte[]
组件是有符号的8位值,但Java数组需要nonnegative integer index values。将byte
转换为int
会导致符号扩展,但屏蔽较高位的位将得到无符号值byte b
:
int i = (int) b & 0xFF;