API ByteBuffer, дающий неправильные целочисленные значения

#java #bytebuffer

#java #байтбуфер

Вопрос:

Я использую API-интерфейсы ByteBuffer для преобразования объекта в байты. Класс объекта выглядит следующим образом

 public class Obj{
int a; // size 1 byte
int b; // size 4 bytes
int c; // size 4 bytes
}
 

Используя API ByteBuffer, я выделил объект

 ByteBuffer bbf = ByteBuffer.allocate(9);
bbf.put((byte) this.getA());
bbf.putInt(this.getB());
bbf.putInt(this.getC());
byte[] msg = bbf.array();
 

Я устанавливаю значение B равным 100, но когда я преобразую массив байтов со смещения 1 до длины 4, я получаю другое целочисленное значение.
Есть какие-нибудь идеи, в чем проблема?
Спасибо!

Комментарии:

1. Смещения равны a: 0, b: 1, c: 5. Вам нужно, чтобы значение было большим или маленьким?

2. я установил порядок байтов на Маленький порядковый номер. Но проблема все еще существует

Ответ №1:

Код работает так, как должен, и если вы действительно выберете байты с индексом 1,2,3,4, они дадут значение 100:

 ByteBuffer bbf = ByteBuffer.allocate(9);
bbf.put((byte) 10);
bbf.putInt(100);
bbf.putInt(55);
byte[] msg = bbf.array();

byte[] from4to8 = Arrays.copyOfRange(msg, 1, 5);

ByteBuffer buf2 = ByteBuffer.wrap(from4to8);
System.out.println(buf2.getInt());             // Prints 100
 

Некоторые заметки:

  • Имейте в виду, что порядковый номер может отличаться от системы к системе (поэтому проверьте порядковый номер на обоих хостах, если это часть протокола)
  • Массив, который вы получаете от bbf.array() вызова, является резервным массивом, т.е.:

    Изменения содержимого этого буфера приведут к изменению содержимого возвращаемого массива, и наоборот.

Комментарии:

1. попробовал ваш код, с порядком байтов как LittleEndian. Я получаю напечатанное значение как 1677721600

2. Это значение, которое вы получите, если возьмете байты 0,1,2,3 вместо 1,2,3,4. (Т.е. Если вы измените значение с 1,5 на 0,4 в примере в моем ответе).

3. Под вторым примечанием вы подразумеваете, что я должен преобразовывать каждую переменную экземпляра отдельно, используя другой объект ByteBuffer? Если нет, пожалуйста, объясните подробно

4. установите также порядок байтов buf2 на маленький порядковый номер

5. Это просто говорит о том, что вы не должны использовать msg в качестве массива, содержащего копию содержимого bbf , это содержимое bbf . Если у вас есть несколько строк между ними, изменение bbf содержимого msg изменится одновременно.


Ответ №2:

Насколько я вижу, B имеет смещение 1

Комментарии:

1. Извините за опечатку. Внесено исправление.