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 倍——只是为了确保它始终有效。

感谢您的快速回答!