2010-02-06 13 views
16

Estoy trasladando un proceso a Java. Ya hay versiones que funcionan en C# y C++.Convirtiendo long [64] en byte [512] en Java?

Tengo una sección en C# que hago Marshal.Copia (...) para convertir 64 ulongs en 512 bytes y esa línea en C++ utilizo memmove (...) para hacer lo mismo. ¿Qué hay disponible en Java para lograr el mismo resultado? Necesito la misma información binaria en el mismo orden que bytes en lugar de longs.

Editar:

La razón por la que estoy portar a Java es tomar ventaja de la portabilidad que Java tiene naturalmente. No me gustaría usar código nativo.

Otra cosa. Como Java no contiene valores sin signo, entonces necesito cambiar un poco lo que estoy solicitando. Me gustaría obtener los 8 valores de bytes sin signo de cada uno de los 64 largos (ulongs en C# y C++) para poder usar esos valores en índices en matrices más tarde. Esto debe suceder miles de veces, así que la manera más rápida sería la mejor.

Respuesta

20

ByteBuffer funciona bien para esto: simplemente ponga en 64 long valores y obtenga un byte[] utilizando el método array(). La clase ByteOrder puede manejar problemas endian de manera efectiva. Por ejemplo, la incorporación del enfoque sugerido en un comentario de 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(); 
} 

Adición: Los byte[] componentes resultantes son firmados, los valores de 8 bits, pero las matrices de Java requiere nonnegative integer index values. Casting a byte a un int resultará en extensión de signo, pero enmascarar los bits de orden superior dará el valor sin signo de byte b:

int i = (int) b & 0xFF; 

Este answer elabora en las reglas de prioridad operador aplicables. Esto relacionado answer demuestra un enfoque similar para double valores.

+1

+1 Ni siquiera necesita el bucle: bb.asLongBuffer(). Put (la); – wierob

+1

¡Gracias! Su sugerencia es más fácil de leer y potencialmente más eficiente. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod