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

17

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

在C#中,我使用Marshal.Copy(...)将64个ulong转换为512个字节,在C++中,我使用memmove(...)执行同样的操作。在Java中有什么方法可以实现相同的结果?我需要以字节而不是longs的方式按相同顺序获取相同的二进制信息。

编辑:

我之所以要将其移植到Java上,是为了利用Java天然的可移植性。我不想使用本机代码。

另外一件事。由于Java不包含无符号值,因此我需要稍微改变我的请求。我想获取每个64个长整型(C#和C++中的ulong)中的8个无符号字节值,以便稍后将这些值用作数组中的索引。这需要重复进行数千次,因此最快的方法是最好的方法。

1个回答

21

ByteBuffer非常适合这个任务:只需放入64个long值,然后使用array()方法获取一个byte[]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数组需要非负整数索引值。将byte转换为int会导致符号扩展,但屏蔽高阶位将给出byte b的无符号值:

int i = (int) b & 0xFF;

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


1
谢谢!您的建议更易读,可能更有效率。http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views - trashgod

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