在swift 2中,将十六进制字符串转换成ASCII字符串的最佳方法是什么?
给定
let str1 = "0x4d 0x4c 0x4e 0x63"
let str2 = "4d 4c 4e 63"
let str3 = "4d4c4e63"
let str4 = "4d4d 4e63"
let str5 = "4d,4c,4e,63"
我们希望运行一个函数(或字符串扩展),该函数将输出:“MLNc”,它是十六进制字符串的ASCII等效字符串
伪代码:
- 去掉所有“垃圾”、逗号空格等
- 获取“2个字符块”,然后使用
strtoul
将这些字符转换为等效的int - 生成字符数组并将其合并为字符串
部分实现
func hexStringtoAscii(hexString : String) -> String {
let hexArray = split(hexString.characters) { $0 == " "}.map(String.init)
let numArray = hexArray.map{ strtoul($0, nil, 16) }.map{Character(UnicodeScalar(UInt32($0)))}
return String(numArray)
}
这个部分实现是在正确的路径上吗?如果是,处理分块的最佳方式是什么
1条答案
按热度按时间ncgqoxb01#
使用正则表达式匹配是从字符串中提取“十六进制数字”的一种可能的方法。您要查找的是一个可选的“0x”,后跟正好2个十六进制数字。对应的正则表达式模式是
"(0x)?([0-9a-f]{2})"
。然后,您可以将每个匹配转换为
Character
,最后将字符连接为String
,这与您的“部分实现”非常相似。这是Swift 2中的新功能。
该模式有两个“捕获组”(括在括号中),第一个匹配可选的“0x”,第二个匹配两个十六进制数字,对应的范围可以用
rangeAtIndex(2)
检索。这将导致以下实现,该实现可以处理所有示例字符串:
(See Swift extract regex matches,以了解转换为
NSString
的说明。)请注意,这个函数是相当宽松的,它只搜索2位十六进制字符串,忽略所有其他字符,所以这也是可以接受的:
Swift 5.1更新: