使用 DEFLATE (RFC 1951) 函数压缩和解压缩 zlib (RFC 1950)

Compress and decompress zlib (RFC 1950) using DEFLATE (RFC 1951) functions

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

但是它们只支持 DEFLATE (RFC 1951) 并且我有使用 ZLIB (RFC 1950) 压缩的数据。

我通过实验发现,如果我删除前 2 个字节,则解压缩有效:

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

这种方法靠谱吗?

为了压缩,我尝试添加 2 个字节 header:

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

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

添加一个 2 字节的 header 0x78, 0x9c 不会(如您观察到的那样)也不应该可靠地工作。因为 RFC1950 期望压缩数据末尾有一个 4 字节的校验和。您的压缩数据将不可移植。解压缩器可能会抱怨数据已损坏。

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

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