Вставка ByteBuffer Little Endian не работает - программирование
Подтвердить что ты не робот

Вставка 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]

Итак, что мне не хватает?

4b9b3361

Ответ 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, и первый метод - самый быстрый, который я нашел. Любопытно, что он быстрее второго фрагмента.