compression - Swift 3 中的数据压缩

标签 compression swift3 ios10 lzma

我在基于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/

相关文章:

c# - HttpClient Gzip 压缩

iOS 将压缩的 NSData 写入文件会生成损坏的 zip 文件

swift3 - 如何在 swift3 中编写 for(i=2;i<=num/2;i++){}

ios10 - widgetPrimaryVibrancyEffect 和 widgetSecondaryVibrancyEffect

ios - UITabbar 在 iOS 10 中拉伸(stretch)但在 11+ 中不拉伸(stretch)

javascript - 如何使用 pako.js javascript? Pako 未定义

ios - 来自 UICollectionViewCell 中的 Class 对象的 UITableView 数据源

ios - 如何在 uitextfield 下使用 uitableview 内部错误并验证

certificate - Xcode 8 代码签名错误

c# - 如何压缩数据