Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java解压缩字节数组_Java_Zip_Gzip_Zlib - Fatal编程技术网

Java解压缩字节数组

Java解压缩字节数组,java,zip,gzip,zlib,Java,Zip,Gzip,Zlib,在服务器(C++)上,使用ZLib函数压缩二进制数据: compress2() 它被发送到客户端(Java)。 在客户端(Java),应使用以下代码段解压缩数据: public static String unpack(byte[] packedBuffer) { InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer); ByteArrayOut

在服务器(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在一边压缩,然后用上面的代码在另一边解压,这样我就可以消除这个问题了?此外,如果有人对这里可能出现的错误有可能的线索(我知道我在这里没有提供太多的代码,但项目相当大)


谢谢。

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

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

刚刚发现这个,可能是helfful:你验证过你在客户端得到正确的数据了吗?例如,你的
packedBuffer
大小合适吗?@Jon Skeet,因为这是一个大系统的遗留代码,首先我想知道我是否可以使用compress2解压用zlib压缩的东西,使用我在上面发布了java代码,所以我可以继续调查问题出在哪里。@乘客:但我的观点是,你不应该仅仅从一个方面来诊断这个问题。你应该看看
compress2()的结果
,对照Java代码中接收到的数据检查长度和数据本身。如果接收到错误的数据,就没有希望正确接收。@Jon Skeet感谢您的努力。是的,我知道这一点,这是我的下一步,但由于这是最容易检查的,而且我在Java中没有太多经验,所以我只是想先检查一下,是否可以使用上面粘贴的Java函数对一侧带有compress2的正确压缩块进行解压缩?请不要建议使用这样的平台默认编码-它非常不可移植。当从字符串转换为字节数组或从字节数组转换为字节数组时,您应该始终指定编码。感谢您的回复Posid,但它也意味着,在某些C++代码中使用ZLIB压缩(使用CysS2函数)应该能够用java解压缩函数解压缩吗?java. UTIL.ZIP是基于ZLIB压缩库(原生DLL)的。我认为它与C++的LILB兼容,但是如果C++用C++解压缩PACKEDDjava,那么它就被压缩成不同的格式。