2012-01-29 19 views
41

Nel mio progetto ho bisogno di sapere come si presenta l'intestazione zlib. Ho sentito che è piuttosto semplice, ma non riesco a trovare alcuna descrizione dell'intestazione di zlib.Che aspetto ha un'intestazione zlib?

Ad esempio, contiene un numero magico?

risposta

52

Link to RFC

0 1 
+---+---+ 
|CMF|FLG| 
+---+---+ 

CMF (Metodo di compressione e flag) Questo byte è diviso in un metodo di compressione 4 bit e un campo di bit di informazione 4- a seconda del metodo di compressione.

bits 0 to 3 CM  Compression method 
bits 4 to 7 CINFO Compression info 

CM (metodo di compressione) Questo identifica il metodo di compressione utilizzato nel file. CM = 8 indica il metodo di compressione "deflate" con una finestra di dimensioni da a 32K. Questo è il metodo utilizzato da gzip e PNG e quasi tutto il resto. CM = 15 è riservato.

CINFO (info Compression) Per CM = 8, CINFO è il logaritmo a base 2 della finestra formato LZ77, meno otto (CINFO = 7 indica una dimensione della finestra 32K). I valori di CINFO sopra 7 non sono consentiti in questa versione della specifica . CINFO non è definita in questa specifica per CM non uguale a 8.

In pratica, questo significa che il primo byte è quasi sempre 78 (esadecimale)

FLG (flag) Questo byte bandiera è divisa come segue:

bits 0 to 4 FCHECK (check bits for CMF and FLG) 
bit 5  FDICT (preset dictionary) 
bits 6 to 7 FLEVEL (compression level) 

Il valore fcheck deve essere tale che CMF e FLG, se visti come un numero intero senza segno a 16 bit memorizzato in ordine MSB (CMF * 256 + FLG), è un multiplo di 31.

FLEVEL (Livello di compressione) Questi flag sono disponibili per l'uso con metodi di compressione specifici . Il metodo di "sgonfiare" (CM = 8) definisce queste bandiere come segue:

 0 - compressor used fastest algorithm 
     1 - compressor used fast algorithm 
     2 - compressor used default algorithm 
     3 - compressor used maximum compression, slowest algorithm 
+0

Questa è un'ottima risposta :), mi ha aiutato in molti modi ... hey! nice avatar – Ryan

74

zlib intestazioni magiche

78 01 - No Compression/low 
78 9C - Default Compression 
78 DA - Best Compression 
+0

Questo mi ha aiutato a capire che tipo di compressione avevo a che fare. Sapevo che il file era compresso, ma stavo facendo ricerche per alcuni byte di intestazione e questo è venuto fuori. Grazie! – ProVega

+4

Quando si utilizza Java Inflator (usa ZLIB) vedo valori di intestazione di 120, -100. Questo equivale a 78 9C. Esegue il backup di ciò che hai detto sopra. – Dan

10

seguito è il formato di dati compresso 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) 
+---+---+---+---+ 

Per lo più, FLG.FDICT (bandiera Dictionary) non è impostato. In questi casi lo DICTID non è semplicemente presente. Quindi, l'ascolto totale è di soli 2 byte.

I valori di intestazione (CMF e FLG) senza dizionario sono definiti come segue.

CMF | FLG 
0x78 | 0x01 - No Compression/low 
0x78 | 0x9C - Default Compression 
0x78 | 0xDA - Best Compression 

Altro ZLIB RFC

0

Tutte le risposte qui sono probabilmente corrette, ma - se si vuole manipolare direttamente flusso di compressione zlib ed è stato prodotto utilizzando gz_open, gzwrite, gzclose funzioni - allora non c'è extra di 10 leader byte intestazione prima del vapore di compressione zlib viene - e quelli sono prodotte dalla funzione gz_open - intestazione assomiglia a questo:

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

e si traduce in seguito esadecimale: 1F 8B 08 00 00 00 00 00 00 0B seguito da flusso di compressione zlib.

ma c'è anche strascicando 8 byte - sono uLong - CRC su tutto il file, uLong - la dimensione del file non compresso - cercare byte seguenti alla fine del flusso:

putLong (s->file, s->crc); 
    putLong (s->file, (uLong)(s->in & 0xffffffff)); 
4

intestazioni 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 non ha intestazioni comuni

+0

Vedo che hai proposto una modifica considerevole a due risposte attualmente più votate. Ciò cambierebbe considerevolmente la risposta. Si prega di non proporre tali modifiche. Invece dovresti pubblicare un commento quando hai una reputazione sufficiente. –