iOS上swift3的本机zlib充气/放气
我希望能够对Swift3数据结构进行充气/放气。我找到了,但不清楚我是如何在iOS应用程序中使用它的。我尝试过的天真的事情包括:iOS上swift3的本机zlib充气/放气,ios,swift,swift3,zlib,swift-data,Ios,Swift,Swift3,Zlib,Swift Data,我希望能够对Swift3数据结构进行充气/放气。我找到了,但不清楚我是如何在iOS应用程序中使用它的。我尝试过的天真的事情包括: 将数据+Gzip.swift文件复制到我自己的项目中。然后,这会抱怨所述文件顶部的导入zlib。我认为这与相同来源的zlib目录中的modulemap文件有关。但我不确定在我自己的项目中如何重新创建它们 从github克隆存储库,打开XCode并内置(基本上按了run按钮)。然后尝试将其作为链接库或框架添加到我自己的项目中。我很确定,仅仅选择存储库的顶级目录并不是我想
数据+Gzip.swift
文件复制到我自己的项目中。然后,这会抱怨所述文件顶部的导入zlib
。我认为这与相同来源的zlib目录中的modulemap文件有关。但我不确定在我自己的项目中如何重新创建它们我在那里找到了一些其他代码,但它似乎过时了,并且与Swift2相关。我最近刚刚不得不将该库和文件添加到我的项目中,经过大量的故障排除后,它终于可以工作了,所以让我带您完成这些步骤 好的 1) 在finder中转到项目的顶级目录,并创建一个名为
Swiftzlib
的新文件夹,或任何您想要导入的模块名称。(我们将把ZLIB库添加为一个模块,所以把它看作是导入基础或一些其他模块)。为了澄清,此Swiftzlib
目录最终将作为包含*.xcodeproj
和*.xcworkspace
文件的同一目录的子目录
2) 在您创建的文件夹中,创建两个文件
- 包括
- module.modulemap
include.h
文件中,输入以下内容:
#include<zlib.h>
module Swiftzlib [system] {
header "include.h"
export *
}
其中Swiftzlib与您创建的文件夹的名称相同
5) 打开您的Xcode项目,并选择您的目标
- 5a)在构建阶段->将二进制文件与库链接,添加
libz.tbd
- 5b)在构建设置->Swift编译器-搜索路径中,将
非递归地添加到导入路径中$(PROJECT_DIR)/Swiftzlib
- 5c)在构建设置->其他链接器标志中,添加
作为标志-lz
- 6a)在构建设置->Swift编译器-搜索路径中,将
非递归地添加到导入路径中$(PROJECT\u DIR)/Swiftzlib
Data+Gzip.swfit
中,将import Swiftzlib
添加到文件顶部
8) 清洁、建造和运行 我在苹果原生libcompression框架上维护了一个小型Swift 3+包装器,位于: gzip的使用示例:
let data: Data! = "https://www.ietf.org/rfc/rfc1952.txt".data(using: .utf8)
let gzipped: Data! = data.zip()
let gunzipped: Data? = gzipped.unzip()
assert(data == gunzipped)
但是,如果您只对经典的充气和放气感兴趣,可以使用
.inflate()
和.deflate()
方法。这将节省18个字节,因为不会添加gzip头。Swift 5使用压缩实现
我花了几天时间才意识到必须删除压缩数据的前2个字节。
希望它能帮助别人
import Foundation
import Compression
func decompress(_ data: Data) -> String {
let size = 8_000_000
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: size)
let result = data.subdata(in: 2 ..< data.count).withUnsafeBytes ({
let read = compression_decode_buffer(buffer, size, $0.baseAddress!.bindMemory(to: UInt8.self, capacity: 1),
data.count - 2, nil, COMPRESSION_ZLIB)
return String(decoding: Data(bytes: buffer, count:read), as: UTF8.self)
}) as String
buffer.deallocate()
return result
}
<代码>导入基础
输入压缩
func解压(u数据:数据)->字符串{
让尺寸=8_000_000
let buffer=unsafemeutablepointer.allocate(容量:大小)
让result=data.subdata(in:2..size
是缓冲区的分配大小,即保留要使用的字节数。如果您不知道要输入多少字节,通常可以输入一个大数字我花了几天的时间才找到同样的答案…谢谢你的回答。我会把我的头发弄出来的!谢谢@vauxhall!你救了我的命!几天后我终于找到了这个答案。我想知道为什么?