我正在将一个进程移植到Java上。C#和C++已经有了可用的版本。
我在C#中有一个Marshal.Copy(...)为了将64个ulong转换为512个字节,我在C++中使用了memmove(...)做同样的事情。在Java中有什么可以实现相同的结果?我需要相同的二进制信息,顺序与字节相同,而不是长整型。
编辑:
我之所以移植到Java,是为了利用Java自然具有的可移植性。我不喜欢使用本机代码。
还有一件事。因为Java不包含无符号值,所以我需要稍微修改一下我请求的内容。我想从64个longs ( C#和C++中的ulong)中的每一个获得8个无符号的字节值,这样我以后就可以在数组中的索引处使用这些值。这需要发生数千次,所以最快的方法将是最好的方法。
发布于 2010-02-06 12:13:44
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;
https://stackoverflow.com/questions/2211927
复制相似问题