我在基于NSData+Compression.swift的扩展中使用LZMA数据压缩在 iOS 10 和自动转换到 Swift 3 之前,它工作得很好。自动转换后,类看起来像这样:
import Compression
extension Data {
static func compress(_ data: Data) -> Data {
let sourceBuffer = (data as NSData).bytes.bindMemory(to: UInt8.self, capacity: data.count)
let sourceBufferSize = data.count
let destinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: sourceBufferSize)
let destinationBufferSize = sourceBufferSize
let status = compression_encode_buffer(destinationBuffer, destinationBufferSize, sourceBuffer, sourceBufferSize, nil, COMPRESSION_LZMA)
if status == 0 {
print("Error with status: \(status)")
}
print("Original size: \(sourceBufferSize) | Compressed size: \(status)")
return Data(bytesNoCopy: UnsafeMutablePointer<UInt8>(destinationBuffer), count: status, deallocator: .free)
}
}
现在该方法的输出始终为空,压缩大小为 0。您能帮我找出这段代码有什么问题吗?
最佳答案
正如 Martin R 所说,问题是目标缓冲区太小。
我现在使用 (data as NSData).length
而不是使用 data.count
,这会产生与之前 Swift 2 的 NSData 相同的大小。此外,我将目标缓冲区大小增加了 2 倍 - 只是为了确保它始终有效。
感谢您的快速答复!
关于compression - Swift 3 中的数据压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39847348/