在Java中将long 转换为byte ?
我正在将进程移植到Java。 已经有了C#和C ++的工作版本。
我在C#中有一个部分,我做Marshal.Copy(…)将64个ulongs转换为512个字节,而C ++中的那行我使用memmove(…)来做同样的事情。 Java中有哪些可以实现相同的结果? 我需要相同的二进制信息,就像字节而不是long一样。
编辑:
我移植到Java的原因是利用Java自然具有的可移植性。 我不想使用本机代码。
另一件事。 由于Java不包含无符号值,因此我需要稍微改变一下我要求的内容。 我想从64个long(C#和C ++中的ulongs)中的每一个获得8个无符号字节值,以便稍后我可以在数组中的索引处使用这些值。 这需要发生数千次,因此最快的方式将是最好的方式。
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;
此答案详细说明了适用的运算符优先级规则。 此相关答案演示了double
值的类似方法。