#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. Извините за опечатку. Внесено исправление.