2011-11-01 3 views
1

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

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

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

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

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

+0

Смещения являются: 0, Ь: 1, с: 5. Вам нужно, чтобы значение было большим эндиантом или маленьким концом? –

+0

Я установил порядок байтов для Little Endian. Но проблема все еще там –

ответ

2

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

Некоторые примечания:

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

    Изменения в содержимое этого буфера будет вызывать содержимое возвращаемого массива для изменения, и наоборот.

+0

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

+0

Это значение, которое вы получаете, если берете байты 0,1,2,3, вместо 1,2,3,4. (I.e. если вы измените с 1,5 до 0,4 в примере в моем ответе). – aioobe

+0

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

1

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

+0

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