【问题标题】:Is it possible to create valid gzip with static dictionary?是否可以使用静态字典创建有效的 gzip?
【发布时间】:2023-12-28 16:19:01
【问题描述】:

我正在尝试创建有效的 gzip 文件(可以使用标准 linux gzip 解压缩),其中的数据使用 DEFLATE 算法和 静态/预设字典进行编码。

我已经阅读了DEFLATEgzip 的两个规范,看起来这是不可能的。正如我从 DEFLATE 规范中得到的,压缩数据块有两种类型的编码:

  • 使用动态字典(滑动窗口)压缩,此类块以 FDICT 标志设置为 0 的标题开头。
  • 用静态压缩(预设字典),用FDICT = 1

但我发现无法将此类字典实际写入文件。是否可以在我的字典/字典中添加一些标题,或者以其他方式使 gzip 解压缩使用FDICT = 1 编码的数据?

附:我正在尝试使用 Java 的 Deflate 类来完成它,但对以这种方式压缩的块的实际 gzip 支持感兴趣。

【问题讨论】:

    标签: gzip zlib deflate


    【解决方案1】:

    您将两个不同的概念混为一谈,所以我不确定您在说哪个。

    有使用静态 Huf​​fman 代码的 deflate 块,通常在压缩非常少量的数据时使用。通常使用动态霍夫曼代码,其中针对特定块优化的代码在块的开头发送。对于少量数据,例如100 字节,该代码描述的开销将支配输出的大小。相反,将使用静态代码,以减少压缩为代价避免开销。但总的来说,结果更小。所有 deflate 应用程序(gzip、zlib、png 等)都支持所有 deflate 块类型。

    另一个概念是预定义字典,它是一个 32K 的数据块,用于预加载在其中搜索匹配字符串的滑动字典。这仅受 zlib 支持。无法为 gzip 流提供预定义的字典。您的“deflate”链接实际上是指向 zlib 格式的链接,这是定义 FDICT 的位置。

    【讨论】:

    • 谢谢!现在我终于明白有两种独立的算法,在 DEFLATE 中,一个的输出通过管道传输到另一个的输入(特别是 LZ77 压缩数据,然后使用 Huffman 编码进行压缩)。你是对的,我提到的那个字典是 LZ77 的预加载滑动窗口,它实际上只有 zlib 支持,而 gzip 使用未包装的 deflate 输出(没有我谈到的带有 FDICT 的标头)。
    最近更新 更多