Сравнение байтов в байт-буфере

#java #arrays #bytebuffer

#java #массивы #байт-буфер

Вопрос:

У меня есть 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 s также есть правильные значения (в соответствии с отладчиком). В чем здесь проблема?

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

1. Опубликованный вами код будет работать нормально (хотя в нем нет ничего интересного array ). Опубликуйте свой реальный код.

2. Вопрос: «Что не так с моим кодом?» Ответ: «Это неправильно !?!» Расскажите нам, что происходит и чего вы ожидаете. Код достаточно прост, поэтому, если вы сядете и попытаетесь объяснить нам, в чем проблема, вы, скорее всего, найдете решение (и вам, возможно, не нужно публиковать вопрос SO).

3. Для эхо-ссылки — что заставляет вас думать, что что-то не так с вашим кодом? Что он делает (или не делает), что отличается от того, что вы ожидаете?

4. Ну, я думал, что это проблема, и вы только что указали, что это правильно! См. Редактирование.

Ответ №1:

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

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

Ответ №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);

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

// выходы «равные»

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

Примечание — Вызов flip() обоих буферов все равно приведет к «равному».

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

1. Нет, это не так. Вызов flip() исправил это.

2. @Nayefc смеется.. с предоставленным вами кодом нет никакой разницы, вызываете вы flip() два байт-буфера или нет. Я тестировал это несколько раз.

3. Я тоже — и это сработало 🙂 Использовал отладчик и отслеживал объекты в куче.