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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用DEFLATE(RFC 1951)函数压缩和解压缩zlib(RFC 1950)相关的知识,希望对你有一定的参考价值。

[在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()的函数可能会起作用。

以上是关于使用DEFLATE(RFC 1951)函数压缩和解压缩zlib(RFC 1950)的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 使用 ZLib 压缩和解压 GZip

flask-compress的使用方法

DEFLATE 文件 (.deflate)要怎么打开,原来是ppt的

flask-compress的使用方法以及对应的http头VaryContent-Encoding的意思

BrotliDeflateZopfliLZMALZHAMBzip2六种无损数据压缩性能比较

详解 HTTP/2 头压缩算法 —— HPACK