2012-11-25 17 views
15

çalışmıyor takın. Eski sistem, küçük bir endian bayt sırası kullanıyor. Alıcı kısmı başarıyla uygulamam ancak gönderim çalışmıyor. [0, 0, 0, 88]ByteBuffer Little Endian ben eski sistemi ve bir android cihaz arasında iki yönlü iletişimi yapmak zorunda

ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
    byteBuffer.order(ByteOrder.BIG_ENDIAN); 
    byteBuffer = ByteBuffer.allocate(4); 
    byteBuffer.putInt(88); 
    byte[] result = byteBuffer.array(); 

Ayrıca sonuçları: Benim için o (ben pek inanabiliriz)

ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
    byteBuffer = ByteBuffer.allocate(4); 
    byteBuffer.putInt(88); 
    byte[] result = byteBuffer.array(); 

Sonuçları ByteBuffer sınıf arızaları gibi görünüyor, çünkü

Garip aynı: [0, 0, 0, 88]

değilim Ancak eğer yanlış little endian sipariş dönmelidir: [88, 0 , 0, 0]

yüzden özlüyorum ne anlamı var?

cevap

29

Sen, garip bir nedenden ötürü, sizin bayt tamponlarını reinitializing ve endian sipariş değişmişti önceki kopya atmadan. Aşağıdaki kod benim için sadece iyi çalışır:

ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
byteBuffer.order(ByteOrder.BIG_ENDIAN); 
byteBuffer.putInt(88); 
byte[] result = byteBuffer.array(); 
System.out.println(Arrays.toString(result)); 

Baskı [0, 0, 0, 88]

ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
byteBuffer.putInt(88); 
byte[] result = byteBuffer.array(); 
System.out.println(Arrays.toString(result)); 

Baskılar ilgili olarak [88, 0, 0, 0]

+0

Belki OP 'ByteBuffer.order' tüm' ByteBuffer's etkileyen küresel değişiklik yapar bu yanlış anlaşılmayı vardır? –

+3

Buna inanamıyorum ama görmedim. İkinci başlatma, kasıtlı değildi. Biraz uyumaya ihtiyacım var. Yine de teşekkürler, – Sandor

+0

Aynı sonucu elde etmek için sebep ne olabilir? [88, 0, 0, 0] [88, 0, 0, 0] ', Android 4.2.2'de Eclipse'de bir testte çıktı olarak ?? – GoRoS

0

not:

Bu kod:

int unicodePointsLen = textContent.length() * 2; 
ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen); 
short unicodePointValue; 
for (int i = 0; i < textContent.length(); i++) 
{ 
    unicodePointValue = (short)textContent.charAt(i); 
    unicodePointsBuffer.put((byte)(unicodePointValue & 0x00FF)).put((byte)(unicodePointValue >> 8)); 
} 

bundan daha yaklaşık% 25 daha hızlı mı: JDK 1.8 kullanma

int unicodePointsLen = textContent.length() * 2; 
ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen); 
unicodePointsBuffer.order(ByteOrder.LITTLE_ENDIAN); 
for (int i = 0; i < textContent.length(); i++) 
{ 
    unicodePointsBuffer.putShort((short)textContent.charAt(i)); 
} 

.

Unicode noktalarını JAVA'dan C++ 'ye JNI'ye aktarmaya çalışıyorum ve ilk yöntem, bulduğum en hızlı yöntemdir. İkinci snippet'ten daha hızlı olduğundan merak ediyorum.

+0

Hızlanma o kadar tuhaf değil. Dahili olarak putShort(), aynı zamanda, endianiteyi de ele alabilir ve sonunda 'put (byte') 'i kullanarak iki ayrı baytı zorlar. – mvds

İlgili konular