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

时间:2010-02-06 03:41:11

标签: java porting

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

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

编辑:

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

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

1 个答案:

答案 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;

answer详细说明了适用的运算符优先级规则。此相关answer演示了double值的类似方法。