使用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)的主要内容,如果未能解决你的问题,请参考以下文章
DEFLATE 文件 (.deflate)要怎么打开,原来是ppt的
flask-compress的使用方法以及对应的http头VaryContent-Encoding的意思