回答編集履歴

2

zip アーカイブのデータ部分を展開する方法について追記

2020/11/25 06:58

投稿

SaitoAtsushi
SaitoAtsushi

スコア5461

test CHANGED
@@ -19,3 +19,15 @@
19
19
 
20
20
 
21
21
  つまり deflate の仕様に反しない範囲でも選択の余地があり、同じ圧縮プログラムで同じパラメータを用いない限り圧縮したバイト列が完全一致するわけではありません。
22
+
23
+
24
+
25
+ # zip のデータ部分の展開について
26
+
27
+
28
+
29
+ zlib ではデフォルトの設定では圧縮時に zlib ヘッダと呼ばれるデータを付加します。 また、展開時にもそのようなヘッダがあることを期待します。 zip アーカイブのデータ部分にはそれがありませんから失敗します。
30
+
31
+
32
+
33
+ ヘッダなしの生の圧縮データを展開するには `inflateInit` のかわりに `inflateInit2` を使い、`windowBits` 引数に `-8`~`-15` を設定することになっています。 zlib の使い方の詳細は zlib.h 内にコメントの形で書かれているので参照してください。

1

質問の追加部分についての回答を追加

2020/11/25 06:58

投稿

SaitoAtsushi
SaitoAtsushi

スコア5461

test CHANGED
@@ -3,3 +3,19 @@
3
3
 
4
4
 
5
5
  実用的には [zlib](https://zlib.net/) などのライブラリを活用するのが普通だと思います。 ライセンスが比較的緩いこともあってよく使われています。
6
+
7
+
8
+
9
+ # 質問の追加部分について
10
+
11
+
12
+
13
+ deflate では LZ77 が使われていますが、 LZ 系の圧縮アルゴリズムというのはそのバイト列中で過去に現れたパターンを「ここからここまでと同じのがここにまた現れるよ」という符号に置き換えることで成立しています。 意味のあるデータにはなんらかの繰り返しが存在するのが普通なのでそれで小さくなるのです。 (なのでランダムに近いデータは圧縮されにくく、 jpeg だと圧縮率はあまり良くないはずです。)
14
+
15
+
16
+
17
+ しかし、過去から同じパータンを探すというのは厳密にやろうとするとかなり時間のかかる処理で、探索範囲に制限をつけるなどしてほどほどにするのが一般的です。 質問者が参考にしたというページで `Z_DEFAULT_COMPRESSION` という値が設定されている箇所が zlib における圧縮レベルの設定です。
18
+
19
+
20
+
21
+ つまり deflate の仕様に反しない範囲でも選択の余地があり、同じ圧縮プログラムで同じパラメータを用いない限り圧縮したバイト列が完全一致するわけではありません。