Сохранить длину байтового массива в байтовом массиве

Я пишу в BufferedOutputStream три раза:

b1 = baos1.toByteArray();  
b2 = baos2.toByteArray();  

bos.write(b1);
bos.write(b2);
bos.write(b1.length);

System.out.println(b1.length);
System.out.println(b2.length);

bos.flush();
bos.close();

Я хочу получить значение write (b1.length) в другом классе, но полученное значение отличается от первого *.println().

System.out.println(aux.length); // The entire stream (b1+b2+b1.length)
System.out.println(aux[aux.length - 1]);

Например:

Версия для печати 1 -> 123744

Println 2 -> 53858

Версия для печати 3 -> 177603

Println 4 -> 96

В этом случае println1 и ​​println4 должны возвращать одинаковый размер. Что я делаю не так?

Я проверил, что записан 1 байт (177603-123744-53858 = 1), что является байтом b1.length.

Может ли кто-нибудь помочь мне правильно написать размер первого байтового массива?

3 ответа

Один byte в Java это знаковое значение с диапазоном -128..127, Этого недостаточно для значения, которое вы пытаетесь сохранить.

Вы должны написать как минимум 4 байта целое число, чтобы управлять длиной до Integer.MAX_VALUE,

Случается так, что значение усекается до 1 байта, это легко увидеть как

123744 == 0x1E360
0x1E360 & 0xFF == 0x60
0x60 = 96

Оберните BufferedOutputStream в DataOutputStream и используйте его write(byte[]) а также writeInt(int) методы.

Я решил проблему, выполнив это:

bos.write(ByteBuffer.allocate(4).putInt(b2.length).array());

вместо:

bos.write(b1.length);

Теперь это работает, и я могу получить длину.

Другие вопросы по тегам