【问题标题】:Converting long[64] to byte[512] in Java?在 Java 中将 long[64] 转换为 byte[512]?
【发布时间】:2011-01-13 19:00:36
【问题描述】:

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

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

编辑:

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

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

【问题讨论】:

    标签: java porting


    【解决方案1】:

    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 数组需要 nonnegative integer index values。将byte 转换为int 会导致符号扩展,但屏蔽高位会得到byte b 的无符号值:

    int i = (int) b & 0xFF;
    

    answer 详细阐述了适用的运算符优先规则。这个相关的answer 演示了double 值的类似方法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2018-05-02
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    相关资源
    最近更新 更多