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

问题描述 投票:1回答:1

[在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)

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

swift zlib deflate
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.