【问题标题】:Native Swift implementation of DEFLATE (unzip) algorithm [closed]DEFLATE(解压缩)算法的本机 Swift 实现 [关闭]
【发布时间】:2015-08-11 23:50:31
【问题描述】:

我有一些使用 DEFLATE 算法压缩的数据,我相信这基本上只是说它被压缩了。我正在编写一个 swift 应用程序,我有兴趣弄清楚解压缩算法是否有本机纯 swift (2.0) 实现。

我需要在 swift 动态框架中实现这一点,因此如果我不必使用 Objective-c 代码会更好,因为这需要我制作一个包含在我的 swift 框架等中的 objc 框架。

我想我的问题是有没有原生的 swift 实现,或者有没有办法使用 swift 调用 zlib 来进行原生解压缩?

谢谢

【问题讨论】:

    标签: swift zlib swift2 compression


    【解决方案1】:

    看看苹果今年夏天推出的Compression framework

    我相信它可以解压缩任何 ZLIB 压缩文件(除其他外)并且应该非常高效。

    【讨论】:

    • 但是就 zlib 而言,这里真的有什么新东西吗?我的意思是,zlib.h 一直都在那里,现在仍然如此。
    • @matt 我相信这是由 Accelerate 人员完成的,他们说 ZLIB 解压缩比参考库快 1.6 倍(不管它是什么)。 API 看起来也与 zlib.h 不同。更多信息:developer.apple.com/videos/wwdc/2015/?id=712
    • 看起来框架是直接使用zlib的(所以性能会和zlib一样)。他们还提供了 zlib 的替代方式,即他们自己的专有 LZFSE 格式,提供与 zlib 相当的压缩比,但压缩和解压缩速度提高了 2 到 3 倍。
    【解决方案2】:

    围绕 Apple 的新 libcompression 清理 Swift 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)
    

    在操场上尝试这个非常有趣,因为通过更改输入字符串,您可以立即看到压缩比。

    【讨论】:

    • 这是仅链接的答案。添加详细信息
    【解决方案3】:

    “zipped up”表示.zip 格式,这与说它已用deflate 压缩不同。 .zip 格式是压缩数据格式的归档包装器,允许在单个 .zip 文件中压缩和存储文件和目录结构以及属性。压缩数据格式包括 deflate(这是最常见的)。

    因此,您的 deflate 压缩数据可能没有以 .zip 文件格式包装。

    Deflate 压缩数据可以包装在 gzip (.gz) 文件、PDF 文件、PNG 文件和其他格式中。

    在任何情况下,您都可以使用 zlib 来解压缩原始 deflate 格式,但是它可能包含在您的数据中,也可能不包含在您的数据中。 zlib 已经作为共享库存在于 OS X 和 iOS 中。正如@MirekE 所述,您可以从新的Compression Framework 访问它。

    【讨论】:

      【解决方案4】:

      github 上有一个 zlib 的原生 swift 实现,称为 DeflateSwift

      【讨论】:

      • 在撰写本文时尚未维护,不会为 Swift 5 编译
      • 另外,它不是 zlib 的本机实现。它只是实际 zlib 的一个接口。
      猜你喜欢
      • 2020-06-16
      • 2023-03-12
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-06
      • 2011-01-15
      • 1970-01-01
      相关资源
      最近更新 更多