私のプロジェクトでは、zlib
ヘッダーがどのように見えるかを知る必要があります。かなり簡単だと聞きましたが、zlibヘッダーの説明が見つかりません。
たとえば、マジックナンバーが含まれていますか?
0 1
+---+---+
|CMF|FLG|
+---+---+
CMF(圧縮方式とフラグ)このバイトは、圧縮方式に応じて、4ビットの圧縮方式と4ビットの情報フィールドに分割されます。
bits 0 to 3 CM Compression method
bits 4 to 7 CINFO Compression info
CM(圧縮方式)これは、ファイルで使用される圧縮方式を識別します。 CM = 8
は、ウィンドウサイズが最大32Kの「deflate」圧縮方式を示します。これは、gzipおよびPNGおよび他のほとんどすべてで使用される方法です。CM = 15は予約されています。
CINFO(圧縮情報)CM = 8の場合、CINFOはLZ77ウィンドウサイズの2を底とする対数から8を引いたものです(CINFO = 7は32Kウィンドウサイズを示します)。 7を超えるCINFOの値は、このバージョンの仕様では許可されていません。 CINFOは、8に等しくないCMのこの仕様では定義されていません。
実際には、これは最初のバイトがほとんど常に78
(16進数)
FLG(FLaGs)このフラグバイトは次のように分割されます。
bits 0 to 4 FCHECK (check bits for CMF and FLG)
bit 5 FDICT (preset dictionary)
bits 6 to 7 FLEVEL (compression level)
FCHECK値は、CMFおよびFLGが、MSB順序(CMF * 256 + FLG)に格納された16ビット符号なし整数として表示される場合、31の倍数である必要があります。
FLEVEL(圧縮レベル)これらのフラグは、特定の圧縮方法で使用できます。 「deflate」メソッド(CM = 8
)これらのフラグを次のように設定します。
0 - compressor used fastest algorithm
1 - compressor used fast algorithm
2 - compressor used default algorithm
3 - compressor used maximum compression, slowest algorithm
zlibマジックヘッダー
78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression
ZLIB/GZIPヘッダー
Level | ZLIB | GZIP
1 | 78 01 | 1F 8B
2 | 78 5E | 1F 8B
3 | 78 5E | 1F 8B
4 | 78 5E | 1F 8B
5 | 78 5E | 1F 8B
6 | 78 9C | 1F 8B
7 | 78 DA | 1F 8B
8 | 78 DA | 1F 8B
9 | 78 DA | 1F 8B
Deflateには共通のヘッダーがありません
Zlib圧縮データ形式は次のとおりです。
+---+---+
|CMF|FLG| (2 bytes - Defines the compression mode - More details below)
+---+---+
+---+---+---+---+
| DICTID | (4 bytes. Present only when FLG.FDICT is set.) - Mostly not set
+---+---+---+---+
+=====================+
|...compressed data...| (variable size of data)
+=====================+
+---+---+---+---+
| ADLER32 | (4 bytes of checksum)
+---+---+---+---+
主に、FLG.FDICT
(辞書フラグ)は設定されていません。そのような場合、DICTID
は単に存在しません。そのため、聞こえる合計はわずか2バイトです。
辞書のないヘッダー値(CMF
およびFLG
)は、次のように定義されます。
CMF | FLG
0x78 | 0x01 - No Compression/low
0x78 | 0x9C - Default Compression
0x78 | 0xDA - Best Compression
ZLIB RFC の詳細
ZLIBヘッダー( RFC195 で定義されている)は、16ビットのビッグエンディアン値です。最上位から最下位までこれらのフィールドが含まれています。
CINFO
(ビット12〜15)
ウィンドウサイズを0
(256バイト)から7
(32768バイト)までの2のべき乗として示します。これは通常7
です。より高い値は許可されません。
CM
(ビット8〜11)
圧縮方法。 Deflate(8
)のみが許可されます。
FLEVEL
(ビット6〜7)
_0
(高速/低)から3
(低速/高)までの圧縮レベルを大まかに示します
FDICT
(ビット5)
プリセット辞書を使用するかどうかを示します。これは通常0
です。 1
は技術的に許可されていますが、プリセット辞書を定義するDeflate形式は知りません。
FCHECK
(ビット0〜4)
チェックサム(5ビット、0
..31
)。その値は、値全体が31を余りなく分割するように計算されます。
通常、CINFO
フィールドとFLEVEL
フィールドのみを自由に変更でき、FCHECK
は最終値に基づいて計算する必要があります。*事前に設定された辞書がないと仮定すると、他のフィールドには何が含まれているので、合計32の可能なヘッダーが有効です。どうぞ:
FLEVEL: 0 1 2 3
CINFO:
0 08 1D 08 5B 08 99 08 D7
1 18 19 18 57 18 95 18 D3
2 28 15 28 53 28 91 28 CF
3 38 11 38 4F 38 8D 38 CB
4 48 0D 48 4B 48 89 48 C7
5 58 09 58 47 58 85 58 C3
6 68 05 68 43 68 81 68 DE
7 78 01 78 5E 78 9C 78 DA
CINFO
フィールドがコンプレッサーによって7
(最大32KBウィンドウを示す)以外に設定されることはめったにないため、実際に表示される可能性のある値は4つだけです。一番下の行(78
で始まる)。
*(FCHECK
の値に少し余裕があるのではないかと思うかもしれません-両方がチェックサムをパスした場合、0または31に設定できますか?実際には、有効なヘッダーはありません。この状況が発生する場所なので、心配する必要はありません。)
ただし、ZLib圧縮ストリームを直接操作したい場合は、gz_open, gzwrite, gzclose
関数-zlib圧縮Steamが来る前に余分な10バイトのヘッダーがあります-そしてそれらは関数gz_openによって生成されます-ヘッダーは次のようになります:
fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
そして、次の16進ダンプが生成されます:1F 8B 08 00 00 00 00 00 00 0B
に続いてzlib圧縮ストリーム。
しかし、末尾の8バイトもあります-それらはuLong
-ファイル全体のcrc、uLong
-非圧縮ファイルサイズ-ストリームの最後で次のバイトを探します:
putLong (s->file, s->crc);
putLong (s->file, (uLong)(s->in & 0xffffffff));