Сохранить длину байтового массива в байтовом массиве
Я пишу в 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);
Теперь это работает, и я могу получить длину.