Swift 3 中的数据压缩
Data Compression in Swift 3
我在基于 NSData+Compression.swift 的扩展中使用 LZMA 数据压缩,直到 iOS 10 并自动转换为 Swift 3. 自动转换后 class 看起来像这样:
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 倍——只是为了确保它始终有效。
感谢您的快速回答!
我在基于 NSData+Compression.swift 的扩展中使用 LZMA 数据压缩,直到 iOS 10 并自动转换为 Swift 3. 自动转换后 class 看起来像这样:
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 倍——只是为了确保它始终有效。
感谢您的快速回答!