Java Zlib充气与C的工作原理不同?

Java Zlib充气与C的工作原理不同?,java,c,zlib,jzlib,Java,C,Zlib,Jzlib,我试图在java中对一个字节数组进行zlib膨胀,但是在膨胀时并没有返回Z_STREAM_END。 我的代码与我看过的一些C代码完全相同,它们使用相同的数据、滑动窗口和其他参数(我想是吧?)。 我正在使用JZlib。这是我的Java代码(dgboff只是文件中这个zlib字节数组的偏移量): 这是C代码,它可以工作(忽略混乱的间距): 如果我遗漏了什么,请告诉我 我正在测试的数据的zlib头是0x649d。您的数据不是zlib流,并且没有zlib头。这是一个原始的放气流。所示的两个代码示例都无法

我试图在java中对一个字节数组进行zlib膨胀,但是在膨胀时并没有返回Z_STREAM_END。 我的代码与我看过的一些C代码完全相同,它们使用相同的数据、滑动窗口和其他参数(我想是吧?)。 我正在使用JZlib。这是我的Java代码(dgboff只是文件中这个zlib字节数组的偏移量):

这是C代码,它可以工作(忽略混乱的间距):

如果我遗漏了什么,请告诉我


我正在测试的数据的zlib头是0x649d。

您的数据不是zlib流,并且没有zlib头。这是一个原始的放气流。所示的两个代码示例都无法工作。您的“这是C代码,它可以工作”一定是其他C代码

要解压缩原始充气数据,需要使用
-15
(而不是
15
)作为
inflateInit2()
的第二个参数


顺便说一下,您提供链接的deflate压缩数据不完整。就其本身而言,它是正确的,但它不会终止。

它返回什么?而且,看起来这个
ZStream
类被标记为已弃用,您可能应该使用
InflaterInputStream
。您确定这两个实例获得的字节序列完全相同吗
0x649d
不是zlib头。C头返回输出字节的长度,字节位于指针处。确实如此,我将头更改为0x329d,以查看它是否会更改任何内容(使用十六进制编辑器),C版表示有错误。那么它可能对字节做了些什么?我将要看一看代码,可能字节数组在那里发生了变化。我看到的C代码来自ttarchext,一个游戏档案提取器。实际的C代码不是,我取出了我认为不会影响任何东西的代码,这里是完整的C方法:我修复了代码,现在可以工作了。还有一个问题,当我尝试使用-15时,我得到了-5(zstreambuf错误)。为什么会发生这种情况?可能是因为您告诉inflate您使用
Z_FINISH
提供了一个完整的放气流,但inflate发现您欺骗了它,并且您的放气流没有终止。我可以做些什么来解决此问题?查找并提供一个完整的放气流。您不必使用
Z_FINISH
,也可以使用多个
inflate()
调用来处理所有数据,但最终需要提供完整的流才能获得
Z_stream\u END
private byte[] z_decompress(byte[] in,int insize,byte[] out,int outsize) {
    ZStream zlib = new ZStream();
    zlib.inflateInit(15);//32k window (2^15)
    zlib.next_in=in;
    zlib.avail_in=insize;
    zlib.next_out=out;
    zlib.avail_out=outsize;
    if(zlib.inflate(JZlib.Z_FINISH)!=JZlib.Z_STREAM_END) {
        System.out.println("Incomplete zlib input at offset "+dgboff+". Compressed size: "+insize+", uncompressed size: "+outsize);
        System.exit(1);
    }
    zlib.inflateEnd();
    return zlib.next_out;
}
 z = calloc(1, sizeof(z_stream)); 
    if(!z) std_err(); 
    z->zalloc = (alloc_func)0; 
    z->zfree  = (free_func)0; 
    z->opaque = (voidpf)0; 
if(inflateInit2(z, 15)) { 
        printf("\nError: initialization error\n"); 
        exit(1); 
 } 
inflateReset(z);

z->next_in   = in;
z->avail_in  = insz;
z->next_out  = out;
z->avail_out = outsz;
if(inflate(z, Z_FINISH) != Z_STREAM_END) {
    printf("\nError: the compressed zlib/deflate input at offset 0x%08x (%d -> %d) is wrong or incomplete\n", (int)g_dbg_offset, (int)insz, (int)outsz);
    exit(1);
}
//gets to here in C