API-интерфейс ByteBuffer, дающий неправильные целочисленные значения - PullRequest
1 голос
/ 01 ноября 2011

Я использую 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, я получаю другое целочисленное значение.Есть идеи, в чем проблема?спасибо!

Ответы [ 2 ]

3 голосов
/ 01 ноября 2011

Код работает как надо, и если вы действительно выберете байты с индексом 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 голос
/ 01 ноября 2011

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

...