Swift中如何从UnsafeMutablePointer<Int8>获取目标字符串?
解决UnsafeMutablePointer转目标字符串的问题
首先,String(validatingUTF8:)返回nil的常见原因有两个:要么你的指针指向的不是以'\0'结尾的标准C字符串,要么内容不是合法的UTF-8编码(不过你的目标是十六进制字符串,应该都是ASCII字符,大概率是缺少终止符的问题)。
根据你的需求,分两种常见场景给出解决方案:
场景1:decrypt返回的是ASCII十六进制字符数组(无终止符)
如果Objective-C的decrypt函数返回的是固定长度的十六进制字符(长度就是传入的el参数),但没有加'\0'终止符,那你可以通过指定长度来读取内容:
// 假设你已经拿到了pointer: UnsafeMutablePointer<Int8> 和 el: Int let buffer = UnsafeBufferPointer(start: pointer, count: el) let data = Data(buffer: buffer) // 因为十六进制字符都是ASCII范围内的,用ASCII编码转换 if let hexString = String(data: data, encoding: .ascii) { print(hexString) // 这就是你要的目标字符串 }
场景2:decrypt返回的是原始二进制数据(需要转十六进制)
如果decrypt返回的是加密后的二进制字节(不是直接的ASCII十六进制字符),那你需要把每个字节转换成两位十六进制字符:
// 同样拿到pointer和el let buffer = UnsafeBufferPointer(start: pointer, count: el) let data = Data(buffer: buffer) // 将每个字节转成两位十六进制,再拼接成字符串 let hexString = data.map { String(format: "%02x", $0) }.joined() print(hexString)
额外注意:内存管理
别忘了确认Objective-C函数返回的char*的内存所有权:如果是函数内部用malloc分配的内存,你需要在Swift中手动调用free(pointer)来释放,避免内存泄漏。
内容的提问来源于stack exchange,提问作者udi
相关产品推荐
相关产品推荐

