2012-11-25 26 views
15

Tôi phải thực hiện liên lạc hai chiều giữa một hệ thống cũ và một thiết bị Android. Hệ thống kế thừa sử dụng ít thứ tự byte cuối cùng. Tôi đã thực hiện thành công phần nhận, tuy nhiên việc gửi không hoạt động.ByteBuffer Little Endian chèn không hoạt động

Strange bởi vì đối với tôi nó có vẻ rằng trục trặc lớp ByteBuffer (tôi khó có thể tin rằng)

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

Kết quả: [0, 0, 0, 88]

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

Ngoài ra kết quả giống nhau: [0, 0, 0, 88]

Tuy nhiên, nếu tôi không nhầm lẫn một số đơn đặt hàng cuối cùng sẽ trả về: [88, 0 , 0, 0]

Vì vậy, tôi đang thiếu điểm nào?

Trả lời

29

Bạn vì lý do lạ lùng nào đó, hãy khởi động lại bộ đệm byte của bạn và vứt bỏ các bản sao trước đó mà bạn đã thay đổi thứ tự cuối. Các mã sau đây làm việc tốt cho tôi:

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

Prints [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)); 

Prints [88, 0, 0, 0]

+0

Có lẽ OP có quan niệm sai rằng 'ByteBuffer.order' tạo ra thay đổi trên toàn cầu, ảnh hưởng đến tất cả' ByteBuffer '? –

+3

Tôi không thể tin được, nhưng tôi không thấy. Việc khởi tạo thứ hai không phải là cố ý. Tôi cần ngủ một chút. Thanks anyway, – Sandor

+0

Điều gì có thể là lý do để có được kết quả tương tự '[88, 0, 0, 0] [88, 0, 0, 0]' trong đầu ra trong một thử nghiệm trong Android 4.2.2 thông qua Eclipse ?? – GoRoS

0

Trên một liên quan lưu ý:

mã này:

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

Nhanh hơn khoảng 25% so với số này:

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

Sử dụng JDK 1.8.

Tôi đang cố chuyển các điểm unicode từ JAVA đến C++ thông qua JNI và phương pháp đầu tiên là nhanh nhất mà tôi tìm thấy. Tò mò rằng nó nhanh hơn đoạn thứ hai.

+0

Tăng tốc không phải là lạ. Bên trong 'putShort()' cũng có thể xử lý endianness và cuối cùng vẫn đẩy hai byte riêng biệt bằng cách sử dụng 'put (byte)'. – mvds

Các vấn đề liên quan