web-dev-qa-db-ja.com

zlibヘッダーはどのようなものですか?

私のプロジェクトでは、zlibヘッダーがどのように見えるかを知る必要があります。かなり簡単だと聞きましたが、zlibヘッダーの説明が見つかりません。

たとえば、マジックナンバーが含まれていますか?

58
unixman83

RFCへのリンク

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
67
0xbadc0de

zlibマジックヘッダー

78 01 - No Compression/low
78 9C - Default Compression
78 DA - Best Compression 
91
VahidN

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には共通のヘッダーがありません

15
Cttr

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 の詳細

14
mk..

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に設定できますか?実際には、有効なヘッダーはありません。この状況が発生する場所なので、心配する必要はありません。)

2
mwfearnley

ただし、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));
1
TarmoPikaro