代码之家  ›  专栏  ›  技术社区  ›  Corey Ogburn

在Java中转换长[ 64 ]到字节[512 ]?

  •  16
  • Corey Ogburn  · 技术社区  · 15 年前

    我正在把一个进程移植到Java上。C语言和C++已经有工作版本了。

    我有一个C语言中的部分,我做元帅。复制(…)把64个ULUN转换成512个字节,而C++中的那个行我使用MeMeSt迁(…)来做同样的事情。在Java中可以获得什么样的结果?我需要相同的二进制信息,以相同的顺序,就像字节而不是长字节一样。

    编辑:

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

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

    1 回复  |  直到 12 年前
        1
  •  20
  •   Community kfsone    7 年前

    ByteBuffer 这样做效果很好:只需输入64 long 值并得到 byte[] 使用外 array() 方法。这个 ByteOrder 类可以有效地处理endian问题。例如,将评论中建议的方法 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();
    }
    

    附录:结果 字节[] 组件被签署,8位值,但是Java阵列需要 nonnegative integer index values .铸造 byte int 将导致符号扩展,但屏蔽高阶位将给出 byte b 以下内容:

    int i = (int) b & 0xFF;
    

    这个 answer 详细说明适用的运算符优先规则。与此相关 answer 演示类似的方法 double 价值观。