收缩压缩的例子

时间:2014-12-30 22:27:44

标签: huffman-code deflate

我有兴趣了解deflate压缩算法,特别是它是如何在数据流中表示的,并且觉得我会从一些额外的例子中受益匪浅(例如压缩一小段文本,或者压缩块的解压缩)。 我将继续研究我找到的一些资源:ref1ref2ref3但这些资源没有很多关于实际压缩如何看作数据流的示例。

如果我能得到一些关于某些字符串在压缩之前和之后的样子的例子,以及对它们之间关系的解释,这将是非常棒的。

此外,如果我有其他资源可以查看,请添加。

2 个答案:

答案 0 :(得分:1)

您可以使用gzip或zlib压缩示例数据,并使用infgen来反汇编并检查生成的压缩数据。 infgen还可以选择查看动态标题中的详细信息。

答案 1 :(得分:1)

+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 仍然不够详细,无法完全理解格式。我在 my blog

上逐位、手动、详细地查看了此处的所有三个示例的解压缩

对于概念,除了相当不错的 RFC 1951 (DEFLATE) 之外,我还推荐 Feldspar 的 conceptual overview of Huffman 代码和 DEFLATE 中的 LZ77