假设我得到一个这样的字符串:
D7C17A4F
如何将每个字符转换为十六进制值?
所以D应该是0xD,7应该是0x7...
现在,我将每个单独的字符表示为ASCII值.D是68,7是55.我正在尝试将这两个值打包成一个字节.例如:D7变成0xD7并C1成为0xC1.我不能使用ASCII十进制值来做到这一点.
可能的解决方案:
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阵列的小优势.
| 归档时间: |
|
| 查看次数: |
4902 次 |
| 最近记录: |