2013-03-24 177 views
-2

我想在iPhone应用中使用zlib将文本文件压缩为gzip文件作为测试。我使用下面的代码Zlib压缩放大文件

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

+2

任何类型的zip压缩将添加一个头来标识格式并提供一个文件名和其他整体结构。对于小文件来说,这种开销完全可能比压缩节省更大。 – 2013-03-24 02:59:34

+0

压缩零大小的文件以查找开销。 – 2013-03-24 03:10:33

+0

@pst我考虑在我的评论中加入这一点,但由于它不适用于这个特定情况,我认为这只是噪音。文本几乎总是可压缩的。 – 2013-03-24 03:31:26

回答

5

GZip格式包含固定大小的头信息。由于您压缩的数据太少,标题信息比您保存的空间大。

90字节通常不值得压缩。

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

+0

是的,我刚刚测试,这就是为什么该文件是如此之小。在增加尺寸后,它确实变小了。 – 2013-03-24 03:06:28

1
  1. 您要压缩的数据太小,没有很多冗余的,所以没有什么留下来压缩。通过消除数据中的重复序列,压缩算法的工作非常简单。在90个字节中,您可能没有太多冗余,除非它是像"aaaaaaa...."这样的文本。
  2. 固定的头部开销,如前所述。

尝试一个更大的数据文件。

2

无论使用哪种压缩算法,总会有产生的数据比输入大的可能性,否则将不可能对任何输入比特模式的组合进行编码。

正如您在特例中已经指出的,与头部开销相比,文件大小非常小似乎是问题所在。

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