[在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)
这在一些简单的情况下有效,但在其他情况下肯定会失败。有什么办法可以使这项工作吗?
添加2字节的标题0x78, 0x9c
将不会(如您所观察到的),并且不应可靠地工作。因为RFC1950期望压缩数据的末尾有4字节的校验和。您的压缩数据将无法移植。解压缩器可能会抱怨数据已损坏。
校验和是此处https://tools.ietf.org/html/rfc1950#section-2.2描述的adler32函数。您可以从zlib源程序包中获取adler32,并通过它运行原始数据,并将4个字节附加到末尾。
但是令我惊讶的是,macOS支持rfc1951,但不支持rfc1950。因为1950是1951的琐碎扩展,它定义了围绕1950格式化数据的包装器。寻找名为inflate()deflate()的函数可能会起作用。