#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