【发布时间】:2020-03-18 19:56:49
【问题描述】:
我有以下代码在 Swift 5 中将一些 Data 解压缩回 String。该方法大部分工作正常,但有时会失败并显示以下错误消息:
Thread 1: Fatal error: UnsafeMutablePointer.initialize overlapping range
extension Data
{
func decompress(destinationSize: Int) -> String?
{
let destinationBuffer = UnsafeMutablePointer<UInt8>.allocate(capacity: destinationSize)
let decodedString = self.withUnsafeBytes
{
unsafeRawBufferPointer -> String? in
let unsafeBufferPointer = unsafeRawBufferPointer.bindMemory(to: UInt8.self)
if let unsafePointer = unsafeBufferPointer.baseAddress
{
let decompressedSize = compression_decode_buffer(destinationBuffer, destinationSize, unsafePointer, self.count, nil, COMPRESSION_ZLIB)
if decompressedSize == 0
{
return String.empty
}
let string = String(cString: destinationBuffer)
let substring = string.substring(0, decompressedSize)
return substring
}
return nil
}
return decodedString
}
}
错误发生在以下行:
let string = String(cString: destinationBuffer)
有人能解释一下为什么这(有时)会失败吗?
【问题讨论】:
-
这只是一个学术练习,还是有理由不能只使用
String(data: encoding:) -
使用这种方法只会给我压缩数据的字符串表示形式。我正在尝试获取解压缩数据的字符串。
-
我不明白区别。上述方法将解码最初编码为
Data的字符串。你想用你的方法从Data中得到什么? -
我的原始字符串是由 GPS 坐标创建的折线。我正在将此折线字符串编码为将存储在 Firestore 中的 Data 对象。现在我正试图从我的解码数据中取回那个字符串。我有解码数据和原始大小(所以我可以分配一个可以保存原始字符串的数组)。
-
我也有同样的问题,你有没有找到好的解释?
标签: swift unsafemutablepointer