java android bytebuffer endianness

java - ByteBuffer Little Endian inserto no funciona



android endianness (2)

En una nota relacionada:

Este código:

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

Es aproximadamente un 25% más rápido que esto:

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

Utilizando JDK 1.8.

Estoy tratando de pasar puntos Unicode de JAVA a C ++ a través de JNI y el primer método es el más rápido que encontré. Curioso que sea más rápido que el segundo fragmento.

Tengo que establecer una comunicación bidireccional entre un sistema heredado y un dispositivo Android. El sistema heredado utiliza el ordenamiento de bytes little endian. He implementado con éxito la parte receptora, sin embargo el envío no funciona.

Extraño porque para mí parece que la clase ByteBuffer funciona mal (casi no puedo creerlo)

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

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

También resulta lo mismo: [0, 0, 0, 88]

Sin embargo, si no me equivoco, el pequeño pedido de endian debería volver: [88, 0, 0, 0]

Entonces, ¿cuál es el punto que me falta?


Está, por alguna extraña razón, reinicializando sus búferes de bytes y desechando las copias anteriores en las que había cambiado la orden endiana. El siguiente código funciona bien para mí:

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

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

Impresiones [88, 0, 0, 0]