十六进制字符串到 UnsafePointer<Int8> swift

问题描述

我正在寻找一种将十六进制字符串转换为 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 并且此类方法 blsSecretKeySetHexStrblsPublicKeyGetHexStr 需要 UnsafePointerUnsafeMutablePointer 作为输入。

解决方法

您可以找到有关 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