2010-02-06 36 views
16

Bir işlemi Java'ya aktarıyorum. C# ve C++ 'da zaten çalışan versiyonlar var.Java'da uzun [64] bayt [512] 'ya dönüştürme?

C# içinde Marshal.Copy (...) yapmam gereken bir bölümüm var ve 64 + 512 bayta dönüştürebilmek için C++ 'da bu satırın aynısını yapmak için memmove (...) kullanıyorum. Aynı sonucu elde etmek için Java'da ne var? Aynı ikili bilgiyi aynı sıraya göre sadece uzun bayt yerine baytlara ihtiyacım var.

Düzenleme:

Java için taşıma nedenim Java doğal olarak vardır taşınabilirlik yararlanmak etmektir. Yerel kod kullanmak istemem.

Başka bir şey. Java imzasız değerleri içermediğinden, az önce istediğimi değiştirmem gerekiyor. 64 uzunluğun her birinden 8 imzasız bayt değerine ulaşmak istiyorum (C# ve C++). Bu değerleri daha sonra dizilerdeki indislerde kullanabilirim. Bunun binlerce kez gerçekleşmesi için en hızlı yol en iyi yol olacaktır.

cevap

20

ByteBuffer bunun için iyi çalışıyor: sadece 64 long değerlerini girin ve array() yöntemini kullanarak bir byte[] alın. ByteOrder sınıfı, endian sorunlarını etkin bir şekilde ele alabilir. Örneğin, bir yaklaşım içeren wierob bir yorumda önerdi:

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(); 
} 

Zeyilname: Oluşan byte[] bileşenleri imzalanır, 8-bitlik değerleri ancak Java dizilerinin nonnegative integer index values gerektirir.

int i = (int) b & 0xFF; 

Bu answer ilgili operatörün öncelik kuralları ayrıntılı olarak açıklanmaktadır: işaret uzantısında sonuçlanacak, int bir byte Döküm, ancak daha yüksek sıralı bitlerini maskeleme byte b arasında işaretsiz değer verecektir. İlgili answer, double değerleri için benzer bir yaklaşım gösterir.

+1

+1 Döngüye bile ihtiyacınız yoktur: bb.asLongBuffer(). Put (la); – wierob

+1

Teşekkürler! Öneriniz daha kolay okunur ve potansiyel olarak daha verimli. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod

İlgili konular