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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:11:16