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]);

例如:

打印 1 --> 123744

打印 2 --> 53858

打印 3 --> 177603

打印 4 --> 96

在这种情况下 println1 和 println4 应该返回相同的大小。我做错了什么?

我检查了写了 1 个字节(177603-123744-53858 = 1),即 b1.length 字节。

有人可以帮我正确写出第一个字节数组的大小吗?

4

3 回答 3

3

Java 中的 singlebyte是带有 range 的有符号值-128..127。这对于您尝试存储的值是不够的。

您应该至少写入一个 4 字节的整数来管理最多Integer.MAX_VALUE.

发生的情况是该值被截断为 1 个字节,这很容易看出

123744 == 0x1E360
0x1E360 & 0xFF == 0x60
0x60 = 96
于 2014-01-02T01:29:07.907 回答
0

将 BufferedOutputStream 包装在 DataOutputStream 中并使用它的write(byte[])writeInt(int)方法。

于 2014-01-02T01:52:05.483 回答
0

我已经解决了这个问题:

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

代替:

bos.write(b1.length);

现在它可以工作了,我可以检索长度。

于 2014-01-02T01:39:04.840 回答