2010-02-06 5 views
16

Przenoszę proces na Javę. Są już działające wersje w C# i C++.Konwersja długiej [64] na bajt [512] w Javie?

Mam sekcji w C#, że robię Marshal.Copy (...), aby przekonwertować 64 ulongs do 512 bajtów i tej linii w C++ Używam memmove (...), aby zrobić to samo. Co jest dostępne w Javie, aby osiągnąć ten sam rezultat? Potrzebuję tych samych informacji binarnych w tej samej kolejności, co bajty zamiast długich.

Edit:

Powodem jestem przenoszenie do Javy jest skorzystać z możliwości przenoszenia, że ​​Java ma naturalnie. Nie chciałbym używać natywnego kodu.

Kolejna sprawa. Ponieważ Java nie zawiera niepodpisanych wartości, muszę trochę zmienić to, o co prosiłem. Chciałbym osiągnąć 8 niepodpisane wartości bajtów z każdej z 64 longs (ulongs w C# i C++), tak, że mogę używać tych wartości w indeksach w tablicach później. To musi się zdarzyć tysiące razy, więc najszybsza droga byłaby najlepsza.

Odpowiedz

20

ByteBuffer działa dobrze na to: po prostu umieścić w 64 long wartości i uzyskać byte[] z wykorzystaniem metody array(). Klasa ByteOrder może skutecznie poradzić sobie z problemami endian. Na przykład włączenie podejście sugerowane w komentarzu przez 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(); 
} 

Uzupełnienie: są podpisane Powstałe byte[] elementy, wartości 8-bitowe, ale tablice Java wymagają nonnegative integer index values. Oddanie byte do int spowoduje rozszerzenie migowym, ale maskowanie wyższe bity rzędu da unsigned wartość byte b:

int i = (int) b & 0xFF; 

Ten answer rozwija obowiązujących zasad pierwszeństwa operator. Ten powiązany answer demonstruje podobne podejście dla wartości double.

+1

+1 Nie potrzebujesz nawet pętli: bb.asLongBuffer(). Put (la); – wierob

+1

Dziękujemy! Twoja sugestia jest łatwiejsza do odczytania i potencjalnie bardziej skuteczna. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod