我正在尝试使用Swift压缩包解压缩一个经过lz4压缩的png图像,但代码退出且大小为零。
我的代码如下,期望解压后的文件大小为240Kb。
[更新2]
我在苹果文档中偶然发现了这个内容:
框架在此处进行了记录,以便您可以轻松地包装另一个LZ4编码器/解码器,以产生/消耗相同的数据流(如果需要)。 LZ4编码缓冲区是一系列块,每个块都以标题开头。有三种可能的标题:
压缩块标题由八位字节0x62、0x76、0x34和0x31组成,后跟表示该块所代表的解码(明文)数据的字节数以及存储在该块中的编码数据的大小(以字节为单位)。两个大小字段都存储为(可能不对齐的)32位小端值。紧随压缩块标题的是实际的LZ4编码数据流。
流结束块标题由八位字节0x62、0x76、0x34和0x24组成,并标志着LZ4帧的结束。在此标题之后不能写入或读取任何其他数据。
因此,我相应地添加了标题和页脚,它可以工作。但是——总会有一个“但是”——在解压缩之前如何知道“解码(明文)数据的字节数”?
框架在此处进行了记录,以便您可以轻松地包装另一个LZ4编码器/解码器,以产生/消耗相同的数据流(如果需要)。 LZ4编码缓冲区是一系列块,每个块都以标题开头。有三种可能的标题:
压缩块标题由八位字节0x62、0x76、0x34和0x31组成,后跟表示该块所代表的解码(明文)数据的字节数以及存储在该块中的编码数据的大小(以字节为单位)。两个大小字段都存储为(可能不对齐的)32位小端值。紧随压缩块标题的是实际的LZ4编码数据流。
流结束块标题由八位字节0x62、0x76、0x34和0x24组成,并标志着LZ4帧的结束。在此标题之后不能写入或读取任何其他数据。
因此,我相应地添加了标题和页脚,它可以工作。但是——总会有一个“但是”——在解压缩之前如何知道“解码(明文)数据的字节数”?
[更新 1]
我给你一个LZ4文件用于测试,并提供从主包中解压缩它的代码用法。
LZ4文件是使用互联网上广泛可用的“LZ4命令行界面64位v1.8.0,由Yann Collet”进行压缩的。
https://drive.google.com/file/d/1eQ204LJs_xsHRwJ_jUcl1Up9NFo8monO/view?usp=sharing
LZ4解压缩用法
if let url = Bundle.main.url(forResource: "TestImage300.png", withExtension: "lz4") {
if let compressed = try? Data(contentsOf: url) {
if let decompressed = compressed.lz4Decompress() {
if let image = UIImage(data: decompressed) {
self.sourceImages.append(image)
print("Unittest: Decompressed image as \(image)")
}
}
}
}
LZ4数据扩展代码用于解压缩:
import Foundation
import Compression
extension Data {
func lz4Decompress() -> Data? {
let destinationBufferSize: size_t = 480000
let destinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: destinationBufferSize)
let sourceBufferSize = count
let decompressed = withUnsafeBytes { (sourceBuffer: UnsafePointer<UInt8>) -> Data? in
let size = compression_decode_buffer(
destinationBuffer, destinationBufferSize,
sourceBuffer, sourceBufferSize,
nil, // scratch buffer automatically handled
COMPRESSION_LZ4
)
if size == 0 {
print("Error ")
return nil
}
print("Original compressed size: \(sourceBufferSize) | Decompressed size: \(size)")
return Data(bytesNoCopy: destinationBuffer, count: size, deallocator: .free)
}
return decompressed
}
}