解压缩二进制文件时错误的EOF

时间:2010-03-31 09:50:57

标签: c++ zip

我尝试使用Lucian Wischik的Zip Utils将二进制文件解压缩到zip存档中的membuf:

http://www.wischik.com/lu/programmer/zip_utils.html

http://www.codeproject.com/KB/files/zip_utils.aspx

FindZipItem(hz, filename.c_str(), true, &j, &ze);
char *content = new char[ze.unc_size];
UnzipItem(hz, j, content, ze.unc_size);
delete[] content;

但它没有正确解压缩文件。它停在文件的第一个0x00处。

例如,当我在ZIP存档中解压缩MP3文件时,它只会解压缩前4个字节:0x49443303(ID3 \ 0),因为第5到第8个字节是0x00

我还尝试捕获ZR_RESULT,并始终返回ZR_OK(这意味着已完成且没有错误)。

我觉得这个家伙也有同样的问题,但是没有人回答他的问题:

http://www.codeproject.com/KB/files/zip_utils.aspx?msg=2876222#xx2876222xx

任何形式的帮助将不胜感激:)

2 个答案:

答案 0 :(得分:1)

可能解压缩就好了。请记住,许多面向字符串的 display 函数将停止在第一个'\0'输出字符。即使您的调试器也会显示char*,就好像它是监视窗口中的字符串一样。它只能猜出字符数组中的数据是什么......你如何测试解压缩的字节数?

你可能想尝试这样的事情:

FindZipItem(hz, filename.c_str(), true, &j, &ze);
char *content = new char[ze.unc_size];
memset(content, 0, ze.unc_size); // added so we can say that if it has a bunch of 0 bytes, then the unzip stopped early.
UnzipItem(hz, j, content, ze.unc_size);

// will print in hex all of the bytes in the array
for(int i = 0; i < ze.unc_size; ++i) {
    printf("%02x ", content[i]);
}

delete[] content;

答案 1 :(得分:0)

我有两个答案。

首先,如果您尝试解压缩MP3文件。你错了。 MP3文件是压缩的,但不使用zip格式。

其次,你怎么知道该库只解压缩前4个字节。您是否尝试printf()内容?或strcpy()它?在这种情况下,行为是正常的,因为这些函数用于处理文本,文本被定义为all-until-the-first-char-0。