博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Swift]GZip字符串压缩和解压缩(Java/C#通用)
阅读量:4704 次
发布时间:2019-06-10

本文共 4842 字,大约阅读时间需要 16 分钟。

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝()
➤GitHub地址:
➤原文地址: 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

一、

定义:Swift libcompression包装器作为数据类型的扩展(GZIP,ZLIB,LZFSE,LZMA,LZ4,deflate,RFC-1950,RFC-1951,RFC-1952)

Data类型的libcompression包装器扩展

支持的压缩算法包括:

  • GZIP格式(.gz文件)
  • ZLIB收缩流
  • ZLIB放弃原始

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

1 let raw: Data! = String(repeating: "There is no place like 127.0.0.1", count: 25).data(using: .utf8) 2  3 print("raw   =>   \(raw.count) bytes") 4  5 for algo: Data.CompressionAlgorithm in [.zlib, .lzfse, .lz4, .lzma] { 6     let compressedData: Data! = raw.compress(withAlgorithm: algo) 7  8     let ratio = Double(raw.count) / Double(compressedData.count) 9     print("\(algo)   =>   \(compressedData.count) bytes, ratio: \(ratio)")10     11     assert(compressedData.decompress(withAlgorithm: algo)! == raw)12 }

输出打印:

1 raw    =>   800 bytes2 zlib   =>    40 bytes, ratio:  20.003 lzfse  =>    69 bytes, ratio:  11.594 lz4    =>   181 bytes, ratio:   4.425 lzma   =>   100 bytes, ratio:   8.00

容器格式

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

注意:gzip格式的压缩数据总是比原始放气数据大18个字节,并将附加/执行基于crc32校验和的数据完整性测试。

zip格式的数据()可以用.zip()和处理.unzip()
1 let data: Data! = "https://www.ietf.org/rfc/rfc1950.txt".data(using: .utf8)2 let zipped: Data! = data.zip()3 let unzipped: Data? = zipped.unzip()4 assert(data == unzipped)

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

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

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

gzip -9 file.txt

该文件应该已经被压缩到file.txt.gz。您现在可以使用以下命令加载和解压缩文件的内容:

1 let compressedData = try? Data(contentsOf: URL(fileURLWithPath: "/path/to/your/file.txt.gz"))2 3 if let uncompressedData = compressedData?.gunzip() {4     print(String(data: uncompressedData, encoding: .utf8) ?? "Can't decode UTF-8")5 }

校验和扩展

与压缩无关但为方便起见,Crc32和Adler32方法也暴露在Data可能派上用场的类型上。

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

将打印:

crc32: 414fa339, adler32: 5bdc0fda

安装:

1 pod 'DataCompression'

使用示例:

1 import Gzip 2  3 // gzip 4 let compressedData: Data = try! data.gzipped() 5 let optimizedData: Data = try! data.gzipped(level: .bestCompression) 6  7 // gunzip 8 let decompressedData: Data 9 if data.isGzipped {10     decompressedData = try! data.gunzipped()11 } else {12     decompressedData = data13 }

GZip字符串压缩和解压缩:

1 //MARK:字符串GZip压缩 2 func compress(_ str:String) -> String 3 { 4     //使用base64编码,转换成Data类型 5     if let data:Data = str.data(using: String.Encoding.utf8) 6     { 7         //GZip压缩 8         let gzipped:Data! = data.gzip() 9         //Data转换为String10         return gzipped.base64EncodedString()11     }12     return String()13 }14 15 //MARK:字符串GZip解压缩16 func decompress(_ str:String) -> String17 {18     //使用base64编码,转换成Data类型,GZip解压缩19     if let data:Data = Data(base64Encoded: str),let gunzipped = data.gunzip()20     {21         //Data类型转换为String22         return String(data: gunzipped , encoding: String.Encoding.utf8) ?? String()23     }24     return String()25 }

二、

定义:GzipSwift是一个带有Swift编写的Data扩展的框架。它使用zlib实现压缩/解压缩gzip。

安装:

pod 'GzipSwift'

用法:

1 import Gzip 2  3 // gzip 4 let compressedData: Data = try! data.gzipped() 5 let optimizedData: Data = try! data.gzipped(level: .bestCompression) 6  7 // gunzip 8 let decompressedData: Data 9 if data.isGzipped {10     decompressedData = try! data.gunzipped()11 } else {12     decompressedData = data13 }

GZip字符串压缩和解压缩:

1 //MARK:字符串GZip压缩 2 func compress(_ str:String) -> String 3 { 4     //使用base64编码,转换成Data类型 5     if let data:Data = str.data(using: String.Encoding.utf8) 6     { 7         //GZip压缩 8         let optimizedData:Data = try! data.gzipped(level: .bestCompression) 9         //Data转换为String10         return optimizedData.base64EncodedString()11     }12     return String()13 }14 15 //MARK:字符串GZip解压缩16 func decompress(_ str:String) -> String17 {18     //使用base64编码,转换成Data类型19     let data:Data = Data(base64Encoded: str) ?? Data()20     //判断是否为GZip压缩的Data21     if data.isGzipped {22         //GZip解压缩23         let decompressedData: Data = try! data.gunzipped()24         //Data类型转换为String25         return String(data: decompressedData , encoding: String.Encoding.utf8) ?? String()26     }27     return String()28 }

 

转载于:https://www.cnblogs.com/strengthen/p/10844466.html

你可能感兴趣的文章
课件动画做的牛不牛,看你有它没它!
查看>>
怎么用MindManager记笔记
查看>>
xargs命令
查看>>
java程序设计课程实验报告1
查看>>
密码的三重属性
查看>>
191. Number of 1 Bits
查看>>
通过划分的方式在线性时间内找出一个序列中第K大的元素
查看>>
用一段代码去了解函数的结构
查看>>
HDFS源码分析数据块复制选取复制源节点
查看>>
java线程池(一)
查看>>
Sublime插件安装
查看>>
Spring主从数据源动态切换
查看>>
JUnit 4在Eclipse中的使用
查看>>
在DOS命令中输入ipconfig /all,出现“该命令不是系统内部命令......”
查看>>
Django中的CSRF
查看>>
百度地图API 绘制轨迹历史
查看>>
jssdk微信图片上传功能
查看>>
c++学习02——queue
查看>>
tensorflow-1day入门
查看>>
spring boot-- 三种启动方式
查看>>