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

2022-09-03 01:47:17

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

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

编辑:

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

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


答案 1

ByteBuffer对此效果很好:只需输入64个值,然后使用该方法获得一个输出。可以有效地处理字节序问题。例如,结合wierob的评论中建议的方法:longbyte[]array()

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

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

int i = (int) b & 0xFF;

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


答案 2

推荐