zlib压缩二进制文件的问题

firsun2003 2009-06-04 02:03:34
要压缩一批二进制文件,文件大小大从几十k到几M吧。
想使用zlib,看到zlib库中有一个文件zpipe.c,里面写了两个方法def(压缩)和inf(解压),想拿来直接使用。
但使用的时候有问题,压缩后的文件是变小了,但解压后只有0k了。
哪位了解情况的指导一下,非常感谢!

我是这么使用的,直接修改了main函数中的语句来测试。

/* compress or decompress from stdin to stdout */
int main(int argc, char **argv)
{
int ret;
FILE *src, *temp, *des;
src = fopen("c:\\test.txt", "r"); // source file
temp = fopen("c:\\test2.txt", "w+"); // compressed file
des = fopen("c:\\test3.txt", "w+"); // uncompressed file, 0K

/* do compression if no arguments */
if (argc == 1) {
ret = def(src, temp, Z_DEFAULT_COMPRESSION);//the original statement is ret = def(standin, standout, Z_DEFAULT_COMPRESSION);
ret = inf(temp, des); // I add the stament to uncompress
if (ret != Z_OK)
zerr(ret);
return ret;
}

/* do decompression if -d specified */
else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
ret = inf(stdin, stdout);
if (ret != Z_OK)
zerr(ret);
return ret;
}

/* otherwise, report usage */
else {
fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
return 1;
}


...全文
680 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
firsun2003 2009-06-08
  • 打赏
  • 举报
回复
感谢goodname和Treazy,使用问题已经搞定,虽然有些地方还没弄明白。
有机会再向大侠们请教!
结贴了!
Treazy 2009-06-05
  • 打赏
  • 举报
回复
压缩时foo.txt 是输入的待压缩的原文件
foo.txt.z是输出的压缩后的文件

解压时foo.txt.z 是输入的待解压缩的原文件
foo.txt是输出的解压后的文件
Treazy 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 firsun2003 的回复:]
如果Treazy或其他大侠可以指导一下如何使用compress或者命令行[/Quote]
将这个zpipe与zlib编译成exe,

//然后在cmd运行输入://当然先指定zpipe.exe的运行路径
zpipe < foo.txt > foo.txt.z // to compress
zpipe -d < foo.txt.z > foo.txt // to decompress.
firsun2003 2009-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Treazy 的回复:]
引用 4 楼 firsun2003 的回复:
二进制好像可以了,非常感谢goodname!
文本文件为什么会出现解压后数据丢失的问题哪?

文本读取时,内容与二进制有略微差异,而解压算法中由于数据不对就无法正确解压了

建议你不要这样修改使用它的example,还是命令行输入为好

如果你想用它的解压与压缩API,而不要用这个example,建议使用compress等这样的接口
[/Quote]
谢谢Treazy!

看了zlib之后,本来想直接使用compress和uncompress这样的接口,但需要将文件映射到内存中去,找了有关映射的代码,感觉搞不定;

所以使用了deflate和inflate这样的接口,至于使用命令行,我也没搞懂。

初学编程,边搜边学,呵呵

如果Treazy或其他大侠可以指导一下如何使用compress或者命令行,将非常感激,呵呵
Treazy 2009-06-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 firsun2003 的回复:]
二进制好像可以了,非常感谢goodname!
文本文件为什么会出现解压后数据丢失的问题哪?
[/Quote]
文本读取时,内容与二进制有略微差异,而解压算法中由于数据不对就无法正确解压了

建议你不要这样修改使用它的example,还是命令行输入为好

如果你想用它的解压与压缩API,而不要用这个example,建议使用compress等这样的接口
firsun2003 2009-06-04
  • 打赏
  • 举报
回复
二进制好像可以了,非常感谢goodname!
文本文件为什么会出现解压后数据丢失的问题哪?
goodname 2009-06-04
  • 打赏
  • 举报
回复
文件打开方式是否应该加上rb,wb等?
firsun2003 2009-06-04
  • 打赏
  • 举报
回复
谢谢goodname,我修改了一下代码。
将ret = inf(temp, des);
修改成了;
fclose(temp);
temp = fopen("c:\\test2_zlib.zlib", "r"); //看zlib的文档说压缩文件必须是zlib格式,这两将test2文件后缀修改为zlib
ret = inf(temp, des);

现在的结果是:
1,拿一个49k的二进制文件来进行压缩和解压测试,得到的test2和test3都只有1k;
2,那一个66k的文本文件来进行压缩和解压测试,得到的test2和test3分别为18k和2k,郁闷的是test3和test文件相比,只有前面一部分内容,后面不知道丢到哪里去了。

我的参数使用不当?

goodname 2009-06-04
  • 打赏
  • 举报
回复
ret = def(src, temp, Z_DEFAULT_COMPRESSION);
我觉得这样连续使用同一个文件句柄temp可能不行,是否应该重新打开文件呢?

ret = inf(temp, des);

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧