【问题标题】:Save length of byte array in a Byte array将字节数组的长度保存在字节数组中
【发布时间】:2014-01-02 01:23:07
【问题描述】:

我在 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

打印 2 --> 53858

Println 3 --> 177603

打印 4 --> 96

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

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

谁能帮我正确写出第一个字节数组的大小?

【问题讨论】:

    标签: java android file-management bytearrayoutputstream bufferedoutputstream


    【解决方案1】:

    Java 中的单个byte 是一个范围为-128..127 的有符号值。这对于您尝试存储的值来说是不够的。

    您应该至少写入一个 4 字节的整数来管理不超过 Integer.MAX_VALUE 的长度。

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

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

    【讨论】:

      【解决方案2】:

      我已经解决了这个问题:

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

      代替:

      bos.write(b1.length);
      

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2020-09-21
          • 2018-10-13
          • 2013-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-14
          • 2013-03-09
          • 2021-05-25
          相关资源
          最近更新 更多