You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中LZMA压缩数据转字符串后解压失败求助

解决LZMA压缩数据转字符串再转回后解压失败的问题

问题根源在于你直接将二进制压缩数据通过UTF8编码转换为字符串的操作——压缩后的compressedData是二进制字节流,包含大量不符合UTF8编码规则的字节,强行转成字符串会导致数据损坏,再转回Data时已经不是原始的压缩数据,因此解压会抛出NSCocoaErrorDomain Code=5377错误。

正确的做法是使用Base64编码将二进制数据转换为可安全存储/传输的字符串,Base64会把任意二进制数据编码为ASCII字符,不会破坏原始数据。

修改后的代码示例

压缩并存储为Base64字符串

var dataForCompress = try String(contentsOfFile: filepath)
let data = dataForCompress.data(using: .utf8)! as NSData
let compressedData = try data.compressed(using: .lzma)

// 将压缩数据转为Base64字符串(可安全写入文件)
let compressedBase64 = compressedData.base64EncodedString()
try compressedBase64.write(toFile: "你的保存路径", atomically: true, encoding: .utf8)

读取Base64字符串并解压

// 从文件读取Base64字符串
let base64String = try String(contentsOfFile: "你的保存路径", encoding: .utf8)

// 将Base64字符串转回原始压缩Data
guard let compressedData = Data(base64Encoded: base64String) else {
    fatalError("读取的Base64字符串无效")
}

// 执行解压
let uncompressedData = try compressedData.decompressed(using: .lzma) as Data
let theString = String(data: uncompressedData, encoding: .utf8)

补充说明

UTF8是专门用于表示文本字符的编码,不适合处理任意二进制数据。当你用String(decoding: compressedData, as: UTF8.self)转换时,系统会将不符合UTF8规则的字节替换为占位符(如�),这直接篡改了原始压缩数据,导致后续解压失败。而Base64是为二进制数据转文本场景设计的编码方式,能保证数据的完整性。

内容的提问来源于stack exchange,提问作者Buka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:07:36