Zlib压缩扩大文件

时间:2013-03-24 02:56:00

标签: c++ ios c zlib

我正在尝试在iPhone应用中使用zlib将文本文件压缩为gzip文件作为测试。我使用以下代码

const char *s = [[Path stringByReplacingOccurrencesOfString:[NSString stringWithFormat:@".%@", [Path pathExtension]] withString:@".gz"] UTF8String];
gzFile *fi = (gzFile *)gzopen(s, "wb");
const char *c = readFile(Path.UTF8String);
gzwrite(fi, c, strlen(c));
gzclose(fi);

其中readFile()返回使用const char*函数从文件中获取的fgets()。问题是,当我使用它来压缩文件时,它不会压缩它,而是gzip文件比原始文件大。例如,我有一个90字节的文本文件,使用此方法后,gzip的大小为98字节。为什么gzip不比原始文件小?

3 个答案:

答案 0 :(得分:6)

GZip格式包括固定大小的标题信息。因为您压缩的数据太少,所以标题信息大于您保存的空间。

90字节通常不值得压缩。

http://www.gzip.org/zlib/rfc-gzip.html#header-trailer

答案 1 :(得分:2)

无论使用何种压缩算法,生成的数据总有可能大于输入,否则将无法对输入位模式的任何组合进行编码。

正如您在特殊情况下所述,与标头开销相比,文件大小非常小似乎是问题所在。

尽管如此,请记住,从来没有保证“压缩”文件的大小会更小。

答案 2 :(得分:1)

  1. 您尝试压缩的数据太小,并且没有很多冗余,因此没有任何内容可以压缩。通过消除数据中的重复序列,压缩算法非常简单。在90个字节中,您可能没有太多冗余,除非它的文本类似于"aaaaaaa...."
  2. 固定标头开销,如前所述。
  3. 尝试更大的数据文件。