Zlib inflate 与 C 的工作方式不同?
Zlib inflate works differently to C?
我正在尝试对 java 中的字节数组进行 zlib 扩充,但是当我对它进行扩充时,我没有得到返回的 Z_STREAM_END。
我的代码与我查看的某些 C 代码完全相同,这些代码使用相同的数据,滑动 window 和其他参数(我认为?)。
我正在使用 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 header 是 0x649d。
您的数据不是 zlib 流,也没有 zlib header。这是一个原始的放气流。显示的代码示例都无法正常工作。您的“这是有效的 C 代码”一定是其他一些 C 代码。
要解压缩原始膨胀数据,您需要使用 -15
(而不是 15
)作为 inflateInit2()
的第二个参数。
顺便说一句,您提供 link 的 deflate 压缩数据不完整。它就目前而言是正确的,但它不会终止。
我正在尝试对 java 中的字节数组进行 zlib 扩充,但是当我对它进行扩充时,我没有得到返回的 Z_STREAM_END。 我的代码与我查看的某些 C 代码完全相同,这些代码使用相同的数据,滑动 window 和其他参数(我认为?)。 我正在使用 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 header 是 0x649d。
您的数据不是 zlib 流,也没有 zlib header。这是一个原始的放气流。显示的代码示例都无法正常工作。您的“这是有效的 C 代码”一定是其他一些 C 代码。
要解压缩原始膨胀数据,您需要使用 -15
(而不是 15
)作为 inflateInit2()
的第二个参数。
顺便说一句,您提供 link 的 deflate 压缩数据不完整。它就目前而言是正确的,但它不会终止。