tags:

views:

173

answers:

1

I'm porting a process over to Java. There's already working versions in C# and C++.

I have a section in C# that I do Marshal.Copy(...) to convert 64 ulongs to 512 bytes and that line in C++ I use memmove(...) to do the same thing. What is available in Java to achieve the same result? I need the same binary information in the same order just as bytes instead of longs.

Edit:

The reason I'm porting to Java is to take advantage of the portability that Java naturally has. I would not like to use native code.

Another thing. Since Java doesn't contain unsigned values, then I need to change what I'm requesting by just a little. I would like to attain the 8 unsigned byte values from each of the 64 longs (ulongs in C# and C++) so that I can use those values at indices in arrays later. This needs to happen thousands of times so the fastest way would be the best way.

+11  A: 

ByteBuffer works well for this: just put in 64 long values and get a byte[] out using the array() method. The ByteOrder class can handle endian issues effectively. For example, incorporating the approach suggested in a comment by 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();
}

Addendum: The resulting byte[] components are signed, 8-bit values, but Java arrays require nonnegative integer index values. Casting a byte to an int will result in sign extension, but masking the higher order bits will give the unsigned value of byte b:

int i = (int) b & 0xFF;

This answer elaborated on the the applicable operator precedence rules.

trashgod
+1 You don't even need the loop: bb.asLongBuffer().put(la);
wierob
Thank you! Your suggestion is easier to read and potentially more efficient. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views
trashgod