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
容器格式
.deflate()
和.inflate()
著名的zlib deflate算法(RFC-1951)也可以使用快捷方式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()
和.gunzip()
处理
gzip格式(RFC-1952)的数据可以使用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()
和.unzip()
进行处理。
以zip格式(RFC-1950)存储的数据可以使用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
与压缩无关,但为了方便起见,Crc32和Adler32方法也被公开在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.0
至 3.7.0
版本 - 支持 Xcode 14 及 Swift 5.7
3.5.0
至 3.6.0
版本 - 最终将目标平台添加到 SPM 包文件中
- Carthage 支持改进
- 支持 Xcode 11 SPM 集成
3.4.0
至 3.5.0
版本 - 修复了当处理大量数据时,Apple 的 lzfse 压缩器出现的 Bug。
3.3.0
至 3.4.0
版本 - Swift 5 正式发布时的弃用警告比 Swift 5 测试版更多。已修复。
3.2.0
至 3.3.0
版本 - 添加 Carthage 支持
3.1.0
到 3.2.0
版本 - podspec swift版本设置为 5.0
- 库文件结构更新,以适应新的swift包管理器布局
3.0.0
到 3.1.0
版本 - podspec swift版本设置为 4.2
2.0.X
到 3.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
除非法律要求或书面同意,否则在许可证下分发的软件按“现状”基准分发,不提供任何明示或暗示的保证或条件。请查看许可证了解具体的管理许可和限制。