Извлечь значения из байтового буфера - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь поместить значения из одного байтового буфера в другой байтовый буфер. Предположим, что исходный буфер байтов имеет ограничение в 20 КБ, а значения, присутствующие в нем, составляют только до 8 КБ, например: {1,2,3,4 .... до 8 КБ, а затем 0,0,0,0,0, .. .till 20kb} Теперь я хочу скопировать в целевой байтовый буфер только значения 8kb, а не значения «0».

Ниже приведен пример кода.

ByteBuffer src = ByteBuffer.allocate(20000);
ByteBuffer dst = ByteBuffer.allocate(32000);
//Adding values to src till 8kb

byte[] b = new byte[src.position()];
src.get(b, 0, b.length); // to get the values from src byte buffer to byte array
if(dst.remaining() > b.length){
    dst.put(b); // to put values got from src to dst
}
src.clear(); // to empty the src

В этом i не получить значения в массиве байтов, которые были в sr c. я получаю {0,0,0,0,0 ....} в байтовом массиве.

Может ли кто-нибудь помочь мне в этом, как просто скопировать значения, которые находятся в байтовом буфере, в другой, не получая нулевые значения. т.е. пустые.

1 Ответ

0 голосов
/ 07 мая 2020

Когда вы заполняете src 8 КБ данных, позиция размером 8 КБ в буфер размером 20000.

Затем вы вызываете src.get(b, 0, b.length), который покорно копирует данные размером 8 КБ (потому что b.length = 8kb) в массив b ... , начиная с текущей позиции, которая составляет 8kb в . Итак, он копирует байты [8192,16384) в ваш массив байтов. Которые, конечно же, все нули.

Итак, как вы это исправить?

Это именно то, для чего предназначен метод flip() буферов: для перехода из режима 'записи' в режим «читать». После того, как sr c набрал 8 КБ данных, переверните ваш буфер (в этот момент position () равен 0, а limit () теперь соответствует позиции, т.е. 8kb), тогда это будет отлично работать.

Затем, чтобы вернуться в начальный режим (готовность к записи до 20000 в буфер), очистите его.

Это поток для буферов:

  • Вы начинаете с position = 0, limit = 20000.
  • Вы читаете некоторый объем данных (в данном случае 8192) в буфер. В какой-то момент pos = 8192, limit = 20000.
  • вы переворачиваете: pos теперь 0, limit = 8192, capacity = 20000.
  • Вы читаете все 8192 во что-то другое; pos теперь 8192, limit 8192, cap 20000.
  • вы очищаете pos теперь 0, емкость 20000, как и предел.
  • go снова в начало. Вы можете делать это бесконечно.

так, записывать в буфер, переворачивать, читать из него, очищать, писать в него, переворачивать, читать из него, очищать - навсегда.

EDIT : Я ошибочно думал, что flip () также переведет вас из «режима чтения» обратно в режим записи. На самом деле это не так, яснее лучше, обновил ответ, чтобы отразить это.

...