给定Swift中的十六进制字符串,转换为十六进制值

Man*_*118 3 hex ascii swift

假设我得到一个这样的字符串:

D7C17A4F

如何将每个字符转换为十六进制值?

所以D应该是0xD,7应该是0x7...

现在,我将每个单独的字符表示为ASCII值.D68,755.我正在尝试将这两个值打包成一个字节.例如:D7变成0xD7C1成为0xC1.我不能使用ASCII十进制值来做到这一点.

Mar*_*n R 5

可能的解决方案:

let string = "D7C17A4F"

let chars = Array(string)
let numbers = map (stride(from: 0, to: chars.count, by: 2)) {
    strtoul(String(chars[$0 ..< $0+2]), nil, 16)
}
Run Code Online (Sandbox Code Playgroud)

使用/sf/answers/2051456641/中的方法,字符串将拆分为两个字符的子字符串.每个子字符串被解释为基数16中的数字序列,并转换为数字strtoul().

验证结果:

println(numbers)
// [215, 193, 122, 79]

println(map(numbers, { String(format: "%02X", $0) } ))
// [D7, C1, 7A, 4F]
Run Code Online (Sandbox Code Playgroud)

更新Swift 2(Xcode 7):

let string = "D7C17A4F"
let chars = Array(string.characters)

let numbers = 0.stride(to: chars.count, by: 2).map {
    UInt8(String(chars[$0 ..< $0+2]), radix: 16) ?? 0
}

print(numbers) 
Run Code Online (Sandbox Code Playgroud)

要么

let string = "D7C17A4F"

var numbers = [UInt8]()
var from = string.startIndex
while from != string.endIndex {
    let to = from.advancedBy(2, limit: string.endIndex)
    numbers.append(UInt8(string[from ..< to], radix: 16) ?? 0)
    from = to
}

print(numbers) 
Run Code Online (Sandbox Code Playgroud)

第二种解决方案看起来有点复杂,但具有不需要额外chars阵列的小优势.