Шестнадцатеричная строка для отключения swift

#swift #string #hex #unsafe-pointers #unsafemutablepointer

Вопрос:

Я ищу лучший способ преобразовать шестнадцатеричную строку в массив незащищенных точек. вот мой текущий код:

 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(amp;sec, pointer, length)
 

Я портирую класс C на Swift, и методы этого класса blsSecretKeySetHexStr и blsPublicKeyGetHexStr требуют в качестве входных данных UnsafePointer и UnsafeMutablePointer.

Комментарии:

1. Реальный вопрос заключается в следующем: зачем вам это нужно UnsafePointer<Int8> ? Вы хотите расшифровать шестнадцатеричную строку?

2. @MartinR Я портирую класс C на swift

3. Я предлагаю вам описать (в вопросе) более подробно, что вы на самом деле хотите сделать.

4. @MartinR сообщение отредактировано.

5. Вы хотите перенести (т. Е. Преобразовать) C в Swift или вы хотите вызывать функции C из Swift?

Ответ №1:

Вы можете найти полезную информацию об UnsafePointer использовании здесь.

Во-первых, если вы хотите передать указатель на строку в функцию, принимающую 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: amp;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: amp;cstring)
// 0x00006000023e0950
// 64

 

или

 var mutableCString = immutableString.utf8CString
let mutableCStringPointer = mutableCString
    .withUnsafeMutableBufferPointer { $0 }
    .baseAddress!
bar(pointer: cStringMutablePointer)
// 0x0000600003478c60
// 64