【问题标题】:Compress and decompress zlib (RFC 1950) using DEFLATE (RFC 1951) functions使用 DEFLATE (RFC 1951) 函数压缩和解压缩 zlib (RFC 1950)
【发布时间】:2019-10-25 11:51:22
【问题描述】:

在 iOS 13 和 macOS 10.15 上,Apple 提供了一些不错的功能,可以在一行代码中进行压缩和解压缩。

但是他们只支持 DEFLATE (RFC 1951),而且我使用 ZLIB (RFC 1950) 压缩了数据。

我通过实验发现,如果我删除前 2 个字节,那么解压缩就可以了:

let output = try NSData(data: input[2...]).decompressed(using: .zlib)

这是一种可靠的方法吗?

为了压缩,我尝试添加一个 2 字节的标头:

let output = try Data([0x78, 0x9c]) + input.compressed(using: .zlib)

这在一些简单的情况下有效,但在其他情况下肯定会失败。有什么办法可以做到吗?

【问题讨论】:

  • 回答this 问题可能会有所帮助。

标签: swift zlib deflate


【解决方案1】:

添加 2 字节标头 0x78, 0x9c 不会(如您所见)并且不应该可靠地工作。因为 RFC1950 要求压缩数据末尾有一个 4 字节的校验和。您的压缩数据将不可移植。解压器可能会抱怨数据已损坏。

校验和是 https://www.rfc-editor.org/rfc/rfc1950#section-2.2 此处描述的 adler32 函数。 您可以从 zlib 源包中获取 adler32 并通过它运行原始数据并将 4 字节附加到末尾。

但令我惊讶的是 macOS 支持 rfc1951 但不支持 rfc1950。因为 1950 是 1951 的一个微不足道的扩展,它定义了一个围绕 1950 格式化数据的包装器。寻找名为 inflate() deflate() 的函数,它可能会起作用。

【讨论】:

  • 谢谢!我没有意识到校验和在 1951 年也丢失了。手动添加 adler32 页脚和页眉工作!
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多