2

在服务器 (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 在一侧压缩并使用上面的代码在另一侧解压缩,所以我可以将其作为问题消除吗?另外,如果有人知道这里可能出了什么问题(我知道我在这里没有提供太多代码,但是项目相当大。

谢谢。

4

1 回答 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
于 2013-03-26T09:51:45.440 回答