0

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);

whereは、関数を使用してファイルから取得したreadFile()a を返します。問題は、これを使用してファイルを圧縮すると、圧縮されず、代わりに gzip ファイルが元のファイルよりも大きくなることです。たとえば、90 バイトのテキスト ファイルがあり、この方法を使用した後の gzip のサイズは 98 バイトです。gzip が元のファイルより小さくないのはなぜですか?const char*fgets()

4

3 に答える 3

7

GZip 形式には、固定サイズのヘッダー情報が含まれます。圧縮するデータが非常に少ないため、ヘッダー情報は、節約できるスペースよりも大きくなります。

通常、90 バイトは圧縮する価値がありません。

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

于 2013-03-24T03:00:03.523 に答える
2

使用される圧縮アルゴリズムに関係なく、生成されたデータが入力よりも大きくなる可能性が常にあります。そうでない場合、入力ビット パターンの任意の組み合わせをエンコードすることはできません。

あなたの特別なケースですでに述べたように、ヘッダーのオーバーヘッドと比較してファイルサイズが非常に小さいことが問題のようです。

それにもかかわらず、「圧縮された」ファイル サイズが小さくなるという保証は決してないことに注意してください。

于 2013-03-24T03:07:24.413 に答える
1
  1. 圧縮しようとしているデータが小さすぎて冗長性があまりないため、圧縮するものが残っていません。圧縮アルゴリズムは、非常に簡単に言えば、データ内の繰り返しシーケンスを排除することによって機能します。90 バイトでは、"aaaaaaa....".
  2. 既に述べたように、ヘッダーのオーバーヘッドを修正しました。

より大きなデータ ファイルを試してください。

于 2013-03-24T03:01:50.727 に答える