Java ByteBuffer Little Endian插入不工作

Java ByteBuffer Little Endian插入不工作,java,android,bytebuffer,endianness,Java,Android,Bytebuffer,Endianness,我必须在传统系统和安卓设备之间进行双向通信。 传统系统使用小端字节排序。 我已经成功地实现了接收部分,但是发送不起作用 奇怪,因为对我来说,ByteBuffer类似乎出现了故障(我简直不敢相信) 结果: [0,0,0,88] ByteBuffer byteBuffer = ByteBuffer.allocate(4); byteBuffer.order(ByteOrder.BIG_ENDIAN); byteBuffer = ByteBuffer.allocate(4);

我必须在传统系统和安卓设备之间进行双向通信。 传统系统使用小端字节排序。 我已经成功地实现了接收部分,但是发送不起作用

奇怪,因为对我来说,ByteBuffer类似乎出现了故障(我简直不敢相信)

结果: [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();
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.LITTLE_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.BIG_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();
ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
byteBuffer.putInt(88);
byte[] result = byteBuffer.array();
System.out.println(Arrays.toString(result));
但是,如果我没有弄错的话,little endian ordering应该会返回: [88,0,0,0]


那么,我遗漏了什么呢?

出于某种奇怪的原因,您正在重新初始化字节缓冲区,并丢弃以前更改了endian顺序的副本。以下代码对我来说很好:

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.BIG_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();
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]

此代码:

 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));
 }
int=textContent.length()*2;
ByteBuffer unicodePointsBuffer=ByteBuffer.allocateDirect(unicodePointsLen);
短值;
对于(int i=0;i>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));  
 }
int=textContent.length()*2;
ByteBuffer unicodePointsBuffer=ByteBuffer.allocateDirect(unicodePointsLen);
unicodePointsBuffer.order(字节顺序.小字节);
对于(int i=0;i
使用JDK1.8


我试图通过JNI将java的Unicode点传递给C++,第一种方法是我发现的最快的方法。奇怪的是,它比第二个片段快。

也许OP有一种误解,认为
ByteBuffer.order
会全局地进行更改,影响所有
ByteBuffer
s?我不敢相信,但我没有看到它。第二次初始化不是有意的。我需要睡一会儿。无论如何,谢谢,加速并不是那么奇怪。内部
putShort()
也可能处理endianness,最后仍然使用
put(byte)
推送两个单独的字节。