数据压缩 3.8.0

数据压缩 3.8.0

测试已验证
语言语言 SwiftSwift
许可证 Apache-2.0
发布最新发布2022年11月
SPM支持 SPM

Markus Wanke 维护。



  • Markus Wanke

DataCompression

Data 类型提供封装扩展的 libcompression 库

支持的压缩算法有

要求

  • iOS 部署目标 >= 9.0
  • macOS 部署目标 >= 10.11
  • tvOS 部署目标 >= 9.0
  • watchOS 部署目标 >= 2.0

Swift版本支持

库版本 Swift版本
3.7.0 5.7 (Xcode 14)
3.6.0 5.1 (Xcode 11)
3.5.0 5.0
3.1.0 4.2
3.0.0 3.0 -> 4.1
2.0.1 < 3.0

用法示例

尝试所有算法并比较压缩比

let raw: Data! = String(repeating: "There is no place like 127.0.0.1", count: 25).data(using: .utf8)

print("raw   =>   \(raw.count) bytes")

for algo: Data.CompressionAlgorithm in [.zlib, .lzfse, .lz4, .lzma] {
    let compressedData: Data! = raw.compress(withAlgorithm: algo)

    let ratio = Double(raw.count) / Double(compressedData.count)
    print("\(algo)   =>   \(compressedData.count) bytes, ratio: \(ratio)")
    
    assert(compressedData.decompress(withAlgorithm: algo)! == raw)
}

会输出类似

raw    =>   800 bytes
zlib   =>    40 bytes, ratio:  20.00
lzfse  =>    69 bytes, ratio:  11.59
lz4    =>   181 bytes, ratio:   4.42
lzma   =>   100 bytes, ratio:   8.00

容器格式

著名的zlib deflate算法(RFC-1951)也可以使用快捷方式.deflate().inflate()
let data: Data! = "https://www.ietf.org/rfc/rfc1951.txt".data(using: .utf8)
let deflated: Data! = data.deflate()
let inflated: Data? = deflated?.inflate()
assert(data == inflated)
gzip格式(RFC-1952)的数据可以使用.gzip().gunzip()处理
let data: Data! = "https://www.ietf.org/rfc/rfc1952.txt".data(using: .utf8)
let gzipped: Data! = data.gzip()
let gunzipped: Data? = gzipped.gunzip()
assert(data == gunzipped)

注意:gzip格式的压缩数据比原始数据大18字节,并将进行基于数据的crc32校验

以zip格式(RFC-1950)存储的数据可以使用.zip().unzip()进行处理。
let data: Data! = "https://www.ietf.org/rfc/rfc1950.txt".data(using: .utf8)
let zipped: Data! = data.zip()
let unzipped: Data? = zipped.unzip()
assert(data == unzipped)

注意:压缩成zip格式的数据会比原始压缩数据大6个字节,并附加/执行基于adler32校验和的数据完整性测试。

在命令行中压缩文件并在Swift中解压缩

最简单的方法是使用已安装的strong>gzip命令行工具。假设您有一个名为strong>file.txt的文件,在调用

gzip -9 file.txt

后,该文件应已被压缩为strong>file.txt.gz。现在,您可以加载并解压缩文件的內容为:

let compressedData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/your/file.txt.gz"))

if let uncompressedData = compressedData?.gunzip() {
    print(String(data: uncompressedData, encoding: .utf8) ?? "Can't decode UTF-8")
}

Checksum extensions

与压缩无关,但为了方便起见,Crc32Adler32方法也被公开在Data类型上,这可能很有用。

let classicExample = "The quick brown fox jumps over the lazy dog".data(using: .utf8)!
let crc32    = classicExample.crc32()
let adler32  = classicExample.adler32()
print("crc32: \(crc32), adler32: \(adler32)")

将打印

crc32: 414fa339, adler32: 5bdc0fda

Install

Cocoa Pods

要使用CocoaPods将DataCompression集成到您的Xcode项目中,将其添加到您的Podfile

target '<your_target_name>' do
    pod 'DataCompression'
end

然后,运行以下命令

$ pod install

然后,您需要在Swift源文件顶部添加import DataCompression以使用扩展。

Carthage

注意:版本小于 3.3.0 的 DataCompression 与 Carthage 不兼容。这意味着只有 Swift 5。

要使用 Carthage 将 DataCompression 集成到您的 Xcode 项目中,请在您的 Cartfile 中将其添加为依赖项。只需添加

github "mw99/DataCompression"

然后,您需要在 Xcode 项目的 carthage copy-frameworks 运行脚本阶段中添加框架路径。路径可能因您针对 Carthage 设置项目的方式而异。

输入
$(SRCROOT)/Carthage/Build/iOS/DataCompression.framework
输出
$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/DataCompression.framework

然后,您需要在Swift源文件顶部添加import DataCompression以使用扩展。

Swift Package Manager

要使用 Swift Package Manager 将 DataCompression 集成到您的 Xcode 项目中,请将其添加到您的 Package.swift 文件中。

import PackageDescription

let package = Package(
    name: "<your_package_name>",
    dependencies: [
        .Package(url: "https://github.com/mw99/DataCompression.git", majorVersion: 3)
    ]
)

然后,您需要在Swift源文件顶部添加import DataCompression以使用扩展。

下次您运行 swift build 时,新的依赖项将被解析。

$ swift build

或者只需将文件复制到您的项目中

您只需要一个位于 Sources/DataCompression.swift 的文件。将其拖放到 Xcode 项目导航器中。

变更日志 / 升级指南

版本 3.6.03.7.0
  • 支持 Xcode 14 及 Swift 5.7
版本 3.5.03.6.0
  • 最终将目标平台添加到 SPM 包文件中
  • Carthage 支持改进
  • 支持 Xcode 11 SPM 集成
版本 3.4.03.5.0
  • 修复了当处理大量数据时,Apple 的 lzfse 压缩器出现的 Bug。
版本 3.3.03.4.0
  • Swift 5 正式发布时的弃用警告比 Swift 5 测试版更多。已修复。
版本 3.2.03.3.0
  • 添加 Carthage 支持
版本 3.1.03.2.0
  • podspec swift版本设置为 5.0
  • 库文件结构更新,以适应新的swift包管理器布局
版本 3.0.03.1.0
  • podspec swift版本设置为 4.2
版本 2.0.X3.0.0
  • ZIP格式编码的数据不再复制,这应该会提高性能。
  • 现在始终使用libz进行校验和验证,速度更快。
  • 移除了.unzip()skipCheckSumValidation:参数。
  • 算法枚举类型的项现在与Swift类似,例如 .LZMA.lzma

版权信息

Apache License,版本 2.0
版权 2016,Markus Wanke

遵循Apache License,版本 2.0(“许可证”)许可;除非遵守本许可证,否则不得使用此文件。您可以在以下位置获取许可证副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非法律要求或书面同意,否则在许可证下分发的软件按“现状”基准分发,不提供任何明示或暗示的保证或条件。请查看许可证了解具体的管理许可和限制。