gzip静态压缩文件格式说明
例1:
“aaaaaaaaaaaaaaaaa” 共17个字符
LZ77编码:
| a | a | a | a | a | a | a | a | a | a | a | a | a | a | a | a | a |
|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| - | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
a(L=16, D=1)
码流:字符、L,D按下文中的固定表获得
| BFINAL | BTYPE | 字符a | L=16 | D=1 | 结束字节 |
|---|
| 1 | 10* | 10010001 | 00010111 | 00000 | 00000000 |
注*:BTYPE需反向读,10→01(固定表)
| 按字节划分 | | | |
|---|
| 11010010 | 00100010 | 11100000 | 00000000 |
| 逆序 | | | |
|---|
| 01001011 | 01000100 | 00000111 | 00000000 |
| 4B | 44 | 07 | 00 |
二进制文件内容:
00000000h: 1F 8B 08 08 E1 5B 68 5F 04 00 61 2E 74 78 74 00 ; .?.醄h_…a.txt.
00000010h: 4B 44 07 00 70 4E C1 1E 11 00 00 00 ; KD…pN?..
| 内容 | 描述 |
|---|
| 1F 8B | ID1 ID2 |
| 08 | CM |
| 08 | FLG |
| E1 5B 68 5F | 修改时间UTC |
| 04 | XFL |
| 00 | OS |
| 61 2E 74 78 74 00 | 文件名 a.txt |
| 4B 44 07 00 | 压缩块 |
| 70 4E C1 1E | 原文CRC32=1E C1 4E 70 |
| 11 00 00 00 | 原文size=00 00 00 11= 17 |
字符literal与长度length共用一个码表:(0到287)
字符表:
| 序号 | Bits | 编码 |
|---|
| 0到143 | 8 | 00110000到10111111 |
| 144到255 | 9 | 110010000到111111111 |
长度表:
| 序号 | Bits | 编码 |
|---|
| 256到279 | 7 | 0000000到0010111 |
| 280到287 | 8 | 11000000到11000111 |
长度码扩展表:
| 序号 | 扩展位个数 | 表示长度值 | 编码 |
|---|
| 257 | 0 | 3 | 0000001 |
| 258 | 0 | 4 | 0000010 |
| 259 | 0 | 5 | 0000011 |
| 260 | 0 | 6 | 0000100 |
| 261 | 0 | 7 | 0000101 |
| 262 | 0 | 8 | 0000110 |
| 263 | 0 | 9 | 0000111 |
| 264 | 0 | 10 | 0001000 |
| 265 | 1 | 11,12 | 0001001 + b |
| 266 | 1 | 13,14 | 0001010 + b |
| 267 | 1 | 15,16 | 0001011 + b |
| 268 | 1 | 17,18 | 0001100 + b |
| 269 | 2 | 19到22 | 0001101 + bb |
| 270 | 2 | 23到26 | 0001110 + bb |
| 271 | 2 | 27到30 | 0001111 + bb |
| 272 | 2 | 31到34 | 0010000 + bb |
| 273 | 3 | 35到42 | 0010001 + bbb |
| 274 | 3 | 43到50 | 0010010 + bbb |
| 275 | 3 | 51到58 | 0010011 + bbb |
| 276 | 3 | 59到66 | 0010100 + bbb |
| 277 | 4 | 67到82 | 0010101 + bbbb |
| 278 | 4 | 83到98 | 0010110 + bbbb |
| 279 | 4 | 99到114 | 0010111 + bbbb |
| 280 | 4 | 115到130 | 11000000 + bbbbb |
| 281 | 5 | 131到162 | 11000001 + bbbbb |
| 282 | 5 | 163到194 | 11000010 + bbbbb |
| 283 | 5 | 195到226 | 11000011 + bbbbb |
| 284 | 5 | 227到257 | 11000100 + bbbbb |
| 285 | 0 | 258 | 11000101 |
距离distance码表
| 序号 | 扩展位个数 | 表示长度值 | 编码 |
|---|
| 0 | 0 | 1 | 00000 |
| 1 | 0 | 2 | 00001 |
| 2 | 0 | 3 | 00010 |
| 3 | 0 | 4 | 00011 |
| 4 | 1 | 5,6 | 00100+1b |
| 5 | 1 | 7,8 | 00101+1b |
| 6 | 2 | 9-12 | 00110+2b |
| 7 | 2 | 13-16 | 00111+2b |
| 8 | 3 | 17-24 | 01000+3b |
| 9 | 3 | 25-32 | 01001+3b |
| 10 | 4 | 33-48 | 01010+4b |
| 11 | 4 | 49-64 | 01011+4b |
| 12 | 5 | 65-96 | 01100+5b |
| 13 | 5 | 97-128 | 01101+5b |
| 14 | 6 | 129-192 | 01110+6b |
| 15 | 6 | 193-256 | 01111+6b |
| 16 | 7 | 257-384 | 10000+7b |
| 17 | 7 | 385-512 | 10001+7b |
| 18 | 8 | 513-768 | 10010+8b |
| 19 | 8 | 769-1024 | 10011+8b |
| 20 | 9 | 1025-1536 | 10100+9b |
| 21 | 9 | 1537-2048 | 10101+9b |
| 22 | 10 | 2049-3072 | 10110+10b |
| 23 | 10 | 3073-4096 | 10111+10b |
| 24 | 11 | 4097-6144 | 11000+11b |
| 25 | 11 | 6145-8192 | 11001+11b |
| 26 | 12 | 8193-12288 | 11010+12b |
| 27 | 12 | 12289-16384 | 11011+12b |
| 28 | 13 | 16385-24576 | 11100+13b |
| 29 | 13 | 24577-32768 | 11101+13b |
参考文档:GZIP压缩 详细介绍了完整的gzip格式和原理