2012-11-25 29 views
15

我必须在遗留系统和Android设备之间进行双向通信。 传统系统使用小端字节排序。 我已经成功实现了接收部分,但发送不起作用。ByteBuffer Little Endian插入不工作

奇怪,因为对我来说似乎ByteBuffer类故障(我很难相信)

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

结果: [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(); 

也导致相同: [0,0,0,88]

但是,如果我没有弄错little end排序应返回: [88,0 ,0,0]

那么我错过了什么?

回答

29

由于某种奇怪的原因,您正在重新初始化您的字节缓冲区,并丢弃您已更改末端顺序的先前副本。下面的代码工作对我蛮好:

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

打印[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)); 

打印[88,0,0,0]

+0

也许OP有一个误解,认为'ByteBuffer.order'全局改变了,影响了所有'ByteBuffer's? –

+3

我不敢相信,但我没有看到它。 第二次初始化不是故意的。 我需要睡一会儿。 无论如何感谢, – Sandor

+0

通过Eclipse在Android 4.2.2测试的输出中得到相同结果'[88,0,0,0] [88,0,0,0]'的原因是什么? ?? – GoRoS

0

与此相关的注意:

此代码:

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

大约比此快25%:

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

使用JDK 1.8。

我想通过JNI将JAVA的unicode点传递给C++,第一种方法是我发现的最快的方法。好奇它比第二个片段更快。

+0

加速并不奇怪。在内部'putShort()'也可以处理字节序,并最终仍然使用'put(byte)'来推送两个单独的字节。 – mvds