放气压缩 - 数值示例

Deflate compression - numerical example

我真的很有兴趣亲眼看到 deflate 压缩如何工作的数值示例。

以下非常短的文本 'abc' 已使用 deflate 算法输出 'eJxLTEoGAAJNASc=' 压缩,其二进制表示法为:

01100101 01001010011000 01110001001100 01010100 01000101011011111111111111111111111111111111111010010101000001 01000001 010010100100101001000110101001010010011010011 01100011 0011110011 001111101

任何人都可以帮助展示位计数步骤是如何工作的,手工将这个 0 和 1 的字符串解码为原始字符串 'abc',好吗?

谢谢!

您的二进制转储是您提供的 Base64 字符串,而不是实际的二进制压缩数据。该数据是十六进制的:

78 9c 4b 4c 4a 06 00 02 4d 01 27

或二进制:

01111000 10011100 01001011 01001100 01001010 00000110 00000000 00000010 01001101 00000001 00100111

您可以使用 infgen 反汇编 deflate 流。您的数据实际上是一个压缩流的 zlib 包装器:

! infgen 2.5 output
!
zlib
!
last                    ! 1
fixed                   ! 01
literal 'a              ! 10010001
literal 'b              ! 10010010
literal 'c              ! 10010011
end                     ! 0000000
                        ! 000000
!
adler

deflate 格式记录在 RFC 1951, and the zlib wrapper in RFC 1950

前两个字节是 zlib header。那么下一个字节的低位是011,其中低位的1表示这是最后一个块,上面的01表示这是一个固定的块。请注意,这些位是从最低有效位到最高有效位(自下而上)读取的。 deflate数据中五个字节的剩余位是符号abc,以及end-of-block符号。接下来是未压缩数据的 four-byte Adler-32 检查值。

这是一个非常无聊的例子,因为它太短了。您将需要一个更长的示例来使用动态块,以便您可以充分探索动态块 header。