ByteBuffer и Byte Array - PullRequest
       80

ByteBuffer и Byte Array

7 голосов
/ 31 августа 2011

Задача

Мне нужно преобразовать два байта и строку переменной длины в байты.

Что я сделал

Я преобразовал каждый тип данных в байтовый массив, а затем добавил их в байтовый буфер. Из которых сразу после этого я скопирую этот буфер в один байтовый массив, как показано ниже.

byte[] nameByteArray = cityName.getBytes();
byte[] xByteArray = ByteBuffer.allocate(4).putInt(x).array();
byte[] yByteArray = ByteBuffer.allocate(4).putInt(y).array();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + xByteArray.length + yByteArray.length);

Теперь это кажется немного излишним. Я, конечно, могу поместить все в байтовый буфер и преобразовать его в байтовый массив. Тем не менее, я понятия не имею, что я длина строки. Итак, как бы я выделил байтовый буфер в этом случае? (для выделения байтового буфера необходимо указать его емкость)

Ответы [ 3 ]

9 голосов
/ 31 августа 2011

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

Поэтому оптимизированная версия должна выглядеть так:

byte[] nameByteArray = cityName.getBytes();
ByteBuffer byteBuffer = ByteBuffer.allocate(nameByteArray.length + 8);
byteBuffer.put(nameByteArray);
byteBuffer.putInt(x);
byteBuffer.putInt(y);
4 голосов
/ 31 августа 2011

Предполагая, что вы хотите все в одном байтовом буфере, почему вы не можете сделать следующее

ByteBuffer byteBuffer = ByteBuffer.allocate( cityName.getBytes().length+ 4+ 4);
byteBuffer.put(cityName.getBytes()).putInt(x).putInt(y);
1 голос
/ 31 августа 2011

Если вы не ограничите максимальную длину строки, вам всегда нужно будет динамически вычислять количество байтов, необходимое для хранения строки. Если вы ограничите строку максимальной длиной, то вы можете заранее рассчитать максимальное количество байтов для хранения любой строки и выделить соответствующий размер ByteBuffer. Хотя это и не требуется для приведенного вами простого примера, вы можете рассмотреть вопрос о сохранении как длины строки в байтах, так и строки. Затем при чтении данных вы знаете, сколько байтов составляет ваша строка.

...