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
相关产品推荐
相关产品推荐

