#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. Я тоже — и это сработало 🙂 Использовал отладчик и отслеживал объекты в куче.