Java解压缩字节数组

时间:2013-03-26 09:01:45

标签: java zip gzip zlib

在服务器(C ++)上,使用ZLib函数压缩二进制数据:

compress2()

并将其发送给客户端(Java)。 在客户端(Java),应使用以下代码片段解压缩数据:

public static String unpack(byte[] packedBuffer) {
    InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer);
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    int readByte;
    try {
        while((readByte = inStream.read()) != -1) {
            outStream.write(readByte);
        }
    } catch(Exception e) {
        JMDCLog.logError(" unpacking buffer of size: " + packedBuffer.length);
        e.printStackTrace();
    // ... the rest of the code follows
}

问题是当它尝试读取while循环时它总是抛出:

  

java.util.zip.ZipException:存储的块长度无效

在我检查其他可能的原因之前,有人可以告诉我,我可以使用compress2在一侧压缩,并使用上面的代码在另一侧解压缩,所以我可以消除这个问题吗?此外,如果有人可能有关于这里可能出错的线索(我知道我在这里没有提供太多的代码,但项目相当大。

感谢。

2 个答案:

答案 0 :(得分:4)

InflaterInputStream期待原始deflate数据(RFC 1951),而compress2()正在生成zlib包装的deflate数据({19}围绕RFC 1951)。

另一方面,

RFC 1950会处理zlib包装的数据(除非你给它nowrap选项)。去图。

答案 1 :(得分:0)

我认为问题不在于unpack方法,而在于packedBuffer内容。解包工作正常

public static byte[] pack(String s) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    DeflaterOutputStream dout = new DeflaterOutputStream(out);
    dout.write(s.getBytes());
    dout.close();
    return out.toByteArray();
}

public static void main(String[] args) throws Exception {
    byte[] a = pack("123");
    String s = unpack(a);   // calls your unpack
    System.out.println(s);
}

输出

123