Вставка ByteBuffer Little Endian не работает
Мне нужно сделать двустороннюю связь между устаревшей системой и устройством Android.
Унаследованная система использует небольшие порядковые байты.
Я успешно выполнил приемную часть, однако отправка не работает.
Странно, потому что для меня кажется, что класс 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]
Однако, если я не ошибаюсь, маленький вердикт должен вернуть:
[88, 0, 0, 0]
Итак, что мне не хватает?
Ответы
Ответ 1
По какой-то странной причине вы повторно инициализируете свои байтовые буферы и выбрасываете предыдущие копии, где вы изменили порядковый номер. Следующий код работает отлично для меня:
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]
Ответ 2
В соответствующей заметке:
Этот код:
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.
Я пытаюсь передать юникодные точки от JAVA до С++ через JNI, и первый метод - самый быстрый, который я нашел. Любопытно, что он быстрее второго фрагмента.