问题描述
我正在寻找一种将十六进制字符串转换为 UnsafePointer 数组的更好方法。这是我当前的代码:
let pointer: UnsafePointer<Int8>? = Nsstring(string: "d0c6a560de2e60b6ac55386defefdf93b0c907290c2ad1b4dbd3338186bfdc68").utf8String
// or
let pointer: UnsafePointer<Int8>? = Nsstring(string: key).utf8String
let length = Nsstring(string: key).length
var res = blsSecretKeySetHexStr(&sec,pointer,length)
我正在将 C++ class 移植到 Swift 并且此类方法 blsSecretKeySetHexStr 和 blsPublicKeyGetHexStr 需要 UnsafePointer 和 UnsafeMutablePointer 作为输入。
解决方法
您可以找到有关 UnsafePointer
用法 here 的有用信息。
首先,如果您想将指向字符串的指针传递给接受 UnsafePointer<Int8>
的函数,您可以简单地执行以下操作:
func foo(pointer: UnsafePointer<Int8>) {
print(pointer) // 0x0000600003478c60
print(strlen(pointer)) // 64
}
let immutableString = "d0c6a560de2e60b6ac55386defefdf93b0c907290c2ad1b4dbd3338186bfdc68"
foo(pointer: immutableString)
// 0x0000600003478c60
// 64
或
let cStringPointer = immutableString.utf8CString
.withUnsafeBufferPointer { $0 }
.baseAddress!
foo(pointer: cStringPointer)
// 0x0000600003478c60
// 64
或
var cstring = immutableString.cString(using: .utf8)!
foo(pointer: &cstring)
// 0x00006000023e0950
// 64
如果你需要一个 UnsafeMutablePointer
:
func bar(pointer: UnsafeMutablePointer<CChar>) {
print(pointer)
print(strlen(pointer))
}
let string = "d0c6a560de2e60b6ac55386defefdf93b0c907290c2ad1b4dbd3338186bfdc68"
var cstring = string.cString(using: .utf8)!
bar(pointer: &cstring)
// 0x00006000023e0950
// 64
或
var mutableCString = immutableString.utf8CString
let mutableCStringPointer = mutableCString
.withUnsafeMutableBufferPointer { $0 }
.baseAddress!
bar(pointer: cStringMutablePointer)
// 0x0000600003478c60
// 64