2010-02-06 19 views
16

Sto trasferendo un processo su Java. Esistono già versioni funzionanti in C# e C++.Conversione da lungo [64] a byte [512] in Java?

Ho una sezione in C# che faccio Marshal.Copy (...) per convertire 64 ulong in 512 byte e quella riga in C++ uso memmove (...) per fare la stessa cosa. Cosa è disponibile in Java per ottenere lo stesso risultato? Ho bisogno delle stesse informazioni binarie nello stesso ordine come byte invece di long.

Edit:

La ragione per cui sto porting di Java è quello di sfruttare la portabilità che Java ha naturalmente. Non vorrei usare il codice nativo.

Un'altra cosa. Dal momento che Java non contiene valori senza segno, quindi ho bisogno di cambiare quello che sto richiedendo solo un po '. Vorrei ottenere gli 8 valori di byte senza segno da ciascuno dei 64 long (ulongs in C# e C++) in modo da poter usare quei valori agli indici negli array in seguito. Questo deve accadere migliaia di volte, quindi il modo più veloce sarebbe il modo migliore.

risposta

20

ByteBuffer funziona bene per questo: basta inserire 64 valori long e ottenere uno byte[] utilizzando il metodo array(). La classe ByteOrder può gestire efficacemente i problemi di endian. Per esempio, che incorpora l'approccio suggerito in un commento di 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: I risultanti byte[] componenti sono firmati, valori a 8 bit, ma array Java richiedono nonnegative integer index values. Casting un byte a un int si tradurrà in estensione del segno, ma mascherare i bit di ordine superiore darà il valore senza segno di byte b:

int i = (int) b & 0xFF; 

Questo answer approfondisce norme operatore precedenza applicabili. Questo valore correlato answer dimostra un approccio simile per i valori double.

+1

+1 Non hai nemmeno bisogno del ciclo: bb.asLongBuffer(). Put (la); – wierob

+1

Grazie! Il tuo suggerimento è più facile da leggere e potenzialmente più efficiente. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod

Problemi correlati