DEFLATE(解压缩)算法的本机 Swift 实现
Native Swift implementation of DEFLATE (unzip) algorithm
我有一些数据是用 DEFLATE 算法压缩的,我相信这基本上只是说压缩了。我正在编写一个 swift 应用程序,我想弄清楚是否有解压缩算法的原生纯 swift (2.0) 实现。
我需要在 swift 动态框架中实现它,因此如果我不必使用 Objective-c 代码会更好,因为这需要我制作一个 objc 框架包含在我的 swift 框架等
我想我的问题是有没有原生的 swift 实现,或者有没有办法使用 swift 调用 zlib 进行原生解压缩?
谢谢
看看苹果今年夏天推出的Compression framework。
我相信它可以解压缩任何 ZLIB 压缩文件(以及其他内容)并且在这方面应该非常高效。
“zipped up”表示是.zip格式,不是说用deflate压缩过的。 .zip 格式是压缩数据格式的归档包装器,允许在单个 .zip 文件中压缩和存储文件和目录结构以及属性。压缩数据格式包括 deflate(最常见)。
所以您的 deflate 压缩数据可能没有以 .zip 文件格式包装。
可以在 gzip (.gz) 文件、PDF 文件、PNG 文件和其他格式中找到 Deflate 压缩数据。
在任何情况下,您都可以使用 zlib 来解压缩原始 deflate 格式,但它可能会或不会包含在您的数据中。 zlib 已经作为共享库存在于 OS X 和 iOS 中。正如@MirekE 所指出的,您可以从新的 Compression Framework.
访问它
github 上有一个 zlib 的本机 swift 实现,名为 DeflateSwift
清理 Swift Apple 新 libcompression 的 3 包装器:
https://github.com/mw99/SwiftDataCompression
用法示例:
let s = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_0123456789"
var res: Data? = s.data(using: .utf8)
res = res?.deflate()
res = res?.inflate()
res = res?.zip()
res = res?.unzip()
res = res?.compress(withAlgorithm: .LZFSE)
res = res?.decompress(withAlgorithm: .LZFSE)
res = res?.compress(withAlgorithm: .LZ4)
res = res?.decompress(withAlgorithm: .LZ4)
res = res?.compress(withAlgorithm: .LZMA)
res = res?.decompress(withAlgorithm: .LZMA)
res = res?.compress(withAlgorithm: .ZLIB)
res = res?.decompress(withAlgorithm: .ZLIB)
assert(res != nil)
let t = String(data: res!, encoding: .utf8)
assert(s == t)
在 playground 中尝试这个非常有趣,因为通过更改输入字符串,您可以立即看到压缩率。
我有一些数据是用 DEFLATE 算法压缩的,我相信这基本上只是说压缩了。我正在编写一个 swift 应用程序,我想弄清楚是否有解压缩算法的原生纯 swift (2.0) 实现。
我需要在 swift 动态框架中实现它,因此如果我不必使用 Objective-c 代码会更好,因为这需要我制作一个 objc 框架包含在我的 swift 框架等
我想我的问题是有没有原生的 swift 实现,或者有没有办法使用 swift 调用 zlib 进行原生解压缩?
谢谢
看看苹果今年夏天推出的Compression framework。
我相信它可以解压缩任何 ZLIB 压缩文件(以及其他内容)并且在这方面应该非常高效。
“zipped up”表示是.zip格式,不是说用deflate压缩过的。 .zip 格式是压缩数据格式的归档包装器,允许在单个 .zip 文件中压缩和存储文件和目录结构以及属性。压缩数据格式包括 deflate(最常见)。
所以您的 deflate 压缩数据可能没有以 .zip 文件格式包装。
可以在 gzip (.gz) 文件、PDF 文件、PNG 文件和其他格式中找到 Deflate 压缩数据。
在任何情况下,您都可以使用 zlib 来解压缩原始 deflate 格式,但它可能会或不会包含在您的数据中。 zlib 已经作为共享库存在于 OS X 和 iOS 中。正如@MirekE 所指出的,您可以从新的 Compression Framework.
访问它github 上有一个 zlib 的本机 swift 实现,名为 DeflateSwift
清理 Swift Apple 新 libcompression 的 3 包装器: https://github.com/mw99/SwiftDataCompression
用法示例:
let s = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ_0123456789"
var res: Data? = s.data(using: .utf8)
res = res?.deflate()
res = res?.inflate()
res = res?.zip()
res = res?.unzip()
res = res?.compress(withAlgorithm: .LZFSE)
res = res?.decompress(withAlgorithm: .LZFSE)
res = res?.compress(withAlgorithm: .LZ4)
res = res?.decompress(withAlgorithm: .LZ4)
res = res?.compress(withAlgorithm: .LZMA)
res = res?.decompress(withAlgorithm: .LZMA)
res = res?.compress(withAlgorithm: .ZLIB)
res = res?.decompress(withAlgorithm: .ZLIB)
assert(res != nil)
let t = String(data: res!, encoding: .utf8)
assert(s == t)
在 playground 中尝试这个非常有趣,因为通过更改输入字符串,您可以立即看到压缩率。