1

Я пишу в 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(); 

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

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

Например:

Println 1 -> 123744

Println 2 -> 53858

Println 3 -> 177603

Println 4 -> 96

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

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

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

ответ

3

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

Чтобы управлять длиной до Integer.MAX_VALUE, необходимо написать не менее 4 байтов.

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

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

Я решил эту проблему, делая это:

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

вместо:

bos.write(b1.length); 

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

0

Wrap BufferedOutputStream в DataOutputStream и использовать его методы write(byte[]) и writeInt(int).

Смежные вопросы