Jee*_*eef 4 regex string xcode swift swift2
在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"
Run Code Online (Sandbox Code Playgroud)
我们想运行一个吐出的函数(或字符串扩展名):'MLNc',它是十六进制字符串的ascii等价物
strtoulfunc 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)
}
Run Code Online (Sandbox Code Playgroud)
这部分实现是否在正确的路径上?如果是这样,处理分块的最佳方法是什么?
使用正则表达式匹配是从字符串中提取"十六进制数"的一种可能方法.你要找的是一个可选的"0x",后面跟着正好2个十六进制数字.相应的正则表达式是"(0x)?([0-9a-f]{2})".
然后你可以将每个匹配转换为a Character并最终将字符连接到a String,与你的"部分实现"非常相似.而不是strtoul()你可以使用UInt32
初始化程序
init?(_ text: String, radix: Int = default)
Run Code Online (Sandbox Code Playgroud)
这是Swift 2中的新功能.
该模式有两个"捕获组"(括在括号中),第一个匹配可选的"0x",第二个匹配两个十六进制数字,可以检索相应的范围
rangeAtIndex(2).
这导致以下实现可以处理所有示例字符串:
func hexStringtoAscii(hexString : String) -> String {
let pattern = "(0x)?([0-9a-f]{2})"
let regex = try! NSRegularExpression(pattern: pattern, options: .CaseInsensitive)
let nsString = hexString as NSString
let matches = regex.matchesInString(hexString, options: [], range: NSMakeRange(0, nsString.length))
let characters = matches.map {
Character(UnicodeScalar(UInt32(nsString.substringWithRange($0.rangeAtIndex(2)), radix: 16)!))
}
return String(characters)
}
Run Code Online (Sandbox Code Playgroud)
(有关转换的说明,请参阅Swift提取正则表达式匹配NSString.)
请注意,此函数非常宽松,它只搜索2位十六进制字符串并忽略所有其他字符,因此也可以接受:
let str6 = "4d+-4c*/4e0x63"
Run Code Online (Sandbox Code Playgroud)
Swift 3更新:
func hexStringtoAscii(_ hexString : String) -> String {
let pattern = "(0x)?([0-9a-f]{2})"
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let nsString = hexString as NSString
let matches = regex.matches(in: hexString, options: [], range: NSMakeRange(0, nsString.length))
let characters = matches.map {
Character(UnicodeScalar(UInt32(nsString.substring(with: $0.rangeAt(2)), radix: 16)!)!)
}
return String(characters)
}
Run Code Online (Sandbox Code Playgroud)