Сравнение байтов в ByteBuffer - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть массив byte в Java размером 4, который я пытаюсь поместить первые два байта в ByteBuffer.

Вот как я это делаю:

byte[] array = new byte[4];
ByteBuffer buff = ByteBuffer.allocate(2);
buff.put(array, 0, 2);

Что не так с моим кодом?

РЕДАКТИРОВАТЬ:

byte[] currRecord = new byte[4];
byte[] leftRecord = new byte[4];
// Code that populates the records
ByteBuffer currKey = ByteBuffer.allocate(2);
currKey = currKey.put(currRecord, 0, 2);
ByteBuffer leftKey = ByteBuffer.allocate(2);
leftKey = leftKey.put(leftRecord, 0, 2);

Затем я пытаюсь сравнить оба ByteBuffers следующим образом:

if (currKey.compareTo(leftKey) >= 0)
    return;

Мое сравнение всегда неверно.При отладке я почти уверен, что currRecord и leftRecord имеют правильные значения.ByteBuffer также имеют правильные значения (согласно отладчику).В чем здесь проблема?

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

compareTo сравнивает оставшихся байтов буферов.Поэтому вы должны сначала flip() оба буфера перед сравнением.

Без flip вы будете сравнивать байты [2..3] в каждом буфере.Поскольку вы не записали эти байты, все они будут равны нулю.С flip вы сравните байты [0..1], которые содержат данные, которые вы записали из массивов.

0 голосов
/ 02 ноября 2011

Вы еще не сказали, какие результаты вы ищете. Код, который вы опубликовали, работал нормально для меня

byte[] currRecord = new byte[4];
byte[] leftRecord = new byte[4];
// Code that populates the records
ByteBuffer currKey = ByteBuffer.allocate(2);
currKey = currKey.put(currRecord, 0, 2);
ByteBuffer leftKey = ByteBuffer.allocate(2);
leftKey = leftKey.put(leftRecord, 0, 2);

if (currKey.compareTo(leftKey) == 0)
    System.out.println("equal");
else
    System.out.println("not equal");

// выводит "равно"

Вы ожидали, что не будет равным? Если так, я не понимаю почему. В вашем коде нет ничего, что явно говорило бы , что они не равны .

Примечание. При вызове flip() в обоих буферах все равно будет получаться "равно".

...