0

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

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;
}

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

 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

如果有什么我想念的,请告诉我!

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

4

1 回答 1

1

您的数据不是 zlib 流,也没有 zlib 标头。这是一个原始的放气流。如图所示,您的两个代码示例都无法正常工作。您的“这是有效的 C 代码”一定是其他一些 C 代码。

要解压缩原始膨胀数据,您需要使用-15(而不是15)作为inflateInit2().

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

于 2020-07-23T15:50:07.863 回答