2012-01-29 17 views
41

Trong dự án của tôi, tôi cần biết tiêu đề zlib trông như thế nào. Tôi đã nghe nó khá đơn giản nhưng tôi không thể tìm thấy bất kỳ mô tả của tiêu đề zlib.Tiêu đề zlib trông như thế nào?

Ví dụ: nó có chứa số ma thuật không?

Trả lời

52

Link to RFC

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

CMF (Compression Method và cờ) byte này được chia thành một phương pháp nén 4-bit và 4 lĩnh vực thông tin chút tùy thuộc vào phương pháp nén.

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

CM (phương pháp nén) Điều này xác định phương pháp nén được sử dụng trong tệp. CM = 8 biểu thị phương pháp nén "giảm tốc" với kích thước cửa sổ lên đến 32K. Đây là phương thức được sử dụng bởi gzip và PNG và hầu hết mọi thứ khác. CM = 15 được đặt trước.

CINFO (thông tin nén) Đối với CM = 8, CINFO là logarit cơ số 2 của cửa sổ LZ77 , trừ 8 (CINFO = 7 cho biết kích thước cửa sổ 32K). Giá trị của CINFO trên 7 không được phép trong phiên bản này của thông số . CINFO không được định nghĩa trong đặc tả này cho CM không bằng 8.

Trong thực tế, điều này có nghĩa là byte đầu tiên là hầu như luôn luôn 78 (hex)

FLG (cờ) byte cờ này được chia như sau:

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

giá trị FCHECK phải được như vậy mà CMF và FLG, khi quan sát như một số nguyên unsigned 16-bit được lưu trữ theo thứ tự MSB (CMF * 256 + FLG), là bội số của 31.

FLEVEL (Mức nén) Những cờ này có sẵn để sử dụng theo phương pháp nén cụ thể . Các "deflate" phương pháp (CM = 8) đặt những lá cờ như sau:

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

Đây là câu trả lời tuyệt vời :), đã giúp tôi bằng nhiều cách ... hey! avatar đẹp – Ryan

74

zlib tiêu đề diệu

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

Điều này đã giúp tôi tìm ra loại nén tôi đang xử lý. Tôi biết các tập tin đã được nén, nhưng đã làm tìm kiếm cho một số byte tiêu đề và điều này đã đưa ra. Cảm ơn! – ProVega

+4

Khi sử dụng Java Inflator (sử dụng ZLIB), tôi thấy các giá trị tiêu đề là 120, -100. Điều này tương đương với 78 9C. Sao lưu những gì bạn đã nói ở trên. – Dan

10

Sau đây là các định dạng dữ liệu zlib nén.

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

Chủ yếu, FLG.FDICT (Cờ từ điển) không được đặt. Trong trường hợp này, DICTID không đơn giản. Vì vậy, tổng số nghe chỉ là 2 byte.

Giá trị tiêu đề (CMFFLG) không có từ điển được định nghĩa như sau.

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

thêm tại ZLIB RFC

0

Tất cả các câu trả lời ở đây là có lẽ hầu hết đúng, tuy nhiên - nếu bạn muốn thao tác dòng nén ZLib trực tiếp, và nó được sản xuất bằng cách sử dụng gz_open, gzwrite, gzclose chức năng - sau đó có thêm 10 byte hàng đầu tiêu đề trước khi hơi nén zlib đến - và những người được sản xuất bởi chức năng gz_open - header trông như thế này:

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

và kết quả ở sau bãi hex: 1F 8B 08 00 00 00 00 00 00 0B theo sau là luồng nén zlib.

Nhưng đó cũng là trailing 8 byte - họ là uLong - crc trên toàn bộ tập tin, uLong - kích thước tập tin nén - tìm kiếm byte sau vào cuối dòng:

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

ZLIB/GZIP tiêu đề

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 

Làm lệch hướng không có tiêu đề phổ biến

+0

Tôi thấy bạn đã đề xuất một thay đổi đáng kể cho hai câu trả lời được bầu chọn hiện tại cao hơn. Điều đó sẽ thay đổi câu trả lời đáng kể. Vui lòng không đề xuất các chỉnh sửa đó. Thay vào đó, bạn nên đăng nhận xét khi bạn có đủ danh tiếng. –