Deflate压缩的示例

3
我对学习deflate压缩算法很感兴趣,特别是它在数据流中的表示方式,并认为一些额外的例子(例如短文本字符串的压缩或压缩块的解压缩)会对我有很大帮助。我正在继续研究一些资源:ref1ref2ref3,但这些资源并没有展示实际压缩后的数据流的许多例子。
如果我能得到一些字符串在被压缩前和压缩后的样子以及它们之间的关系的解释,那将非常棒。
此外,如果有其他资源可以参考,请添加。
2个回答

2

您可以使用gzip或zlib压缩示例数据,然后使用infgen来分解和检查生成的压缩数据。infgen还有一个选项可以查看动态头部的详细信息。


2
+1给infgen,但这里有一个稍微详细一点的答案。
您可以使用gzip和任何十六进制编辑器查看压缩前后的内容。例如,在大多数Linux发行版中都包含了xxd。我已经包含了原始十六进制输出(如果不理解就不是很有趣)和infgen的输出。
  • hello hello hello hello(触发静态霍夫曼编码,像大多数短字符串一样)。
~ $ echo -n "hello hello hello hello" | gzip | xxd
00000000: 1f8b 0800 0000 0000 0003 cb48 cdc9 c957  ...........H...W
00000010: c840 2701 e351 3d8d 1700 0000            .@'..Q=.....

~ $ echo -n "hello hello hello hello" | gzip | ./infgen/a.out -i
! infgen 2.4 output
!
gzip
!
last
fixed
literal 'hello h
match 16 6
end
!
crc
length
  • \xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1(触发未压缩模式)
~ $ echo -ne "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1" | gzip | xxd
00000000: 1f8b 0800 0000 0000 0003 010f 00f0 ffff  ................
00000010: fefd fcfb faf9 f8f7 f6f5 f4f3 f2f1 c6d3  ................
00000020: 157e 0f00 0000                           .~....

~ $ echo -ne "\xff\xfe\xfd\xfc\xfb\xfa\xf9\xf8\xf7\xf6\xf5\xf4\xf3\xf2\xf1" | gzip | ./infgen/a.out -i
! infgen 2.4 output
!
gzip
!
last
stored
data 255 254 253 252 251 250 249 248 247 246 245 244 243 242 241
end
!
crc
length
  • abaabbbabaababbaababaaaabaaabbbbbaa(触发动态哈夫曼编码)
~ $ echo -n "abaabbbabaababbaababaaaabaaabbbbbaa" | gzip | xxd
00000000: 1f8b 0800 0000 0000 0003 1dc6 4901 0000  ............I...
00000010: 1040 c0ac a37f 883d 3c20 2a97 9d37 5e1d  .@.....=< *..7^.
00000020: 0c6e 2934 9423 0000 00                   .n)4.#...

~ $ echo -n "abaabbbabaababbaababaaaabaaabbbbbaa" | gzip | ./infgen/a.out -i -d
! infgen 2.4 output
!
gzip
!
last
dynamic
count 260 7 18
code 1 4
code 2 1
code 4 4
code 16 4
code 17 4
code 18 2
zeros 97
lens 1 2
zeros 138
zeros 19
lens 4
repeat 3
lens 2
zeros 3
lens 2 2 2
! litlen 97 1
! litlen 98 2
! litlen 256 4
! litlen 257 4
! litlen 258 4
! litlen 259 4
! dist 0 2
! dist 4 2
! dist 5 2
! dist 6 2
literal 'abaabbba
match 4 7
match 3 9
match 5 6
literal 'aaa
match 5 5
literal 'b
match 4 1
literal 'aa
end
!
crc
length

我发现infgen仍然没有足够的细节来完全理解格式。我通过手动逐位解压这里的三个示例,详细地查看了我的博客
对于概念,除了RFC 1951(DEFLATE)相当不错之外,我还推荐Feldspar的Huffman编码和DEFLATE中的LZ77的概念概述

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接