特定
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) {init?(_ text: String,radix: Int = default)== " "}.map(String.init) let numArray = hexArray.map{ strtoul(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(.rangeAtIndex(2)),radix: 16)!)) } return String(characters)},nil,16) }.map{Character(UnicodeScalar(UInt32()))} return String(numArray)}
这部分实现是否在正确的路径上?如果是这样,处理分块的最佳方法是什么?
解决方法 使用正则表达式匹配是一种可能的方法来提取字符串中的“十六进制数字”.
您正在寻找的是一个可选的“0x”,紧接着是
2位十六进制数字相应的正则表达式模式是“(0x)?([0-9a-f] {2})”.
然后你可以将每个匹配转换为一个Character,最后连接
String中的字符,与您的“部分实现”非常相似.您可以使用UInt32代替strtoul()
初始化
这是Swift 2中的新功能.
该模式有两个“捕获组”(括在括号中),
第一个匹配可选的“0x”,第二个匹配
两个十六进制数字,可以检索相应的范围
rangeAtIndex(2).
这导致以下实现可以处理所有
你的样本字符串:
(有关转换为Nsstring的说明,请参阅Swift extract regex matches.)
请注意,此功能非常宽松,只需搜索
2位十六进制字符串并忽略所有其他字符,所以这个
也会被接受:
let str6 = "4d+-4c*/4e 总结以上是内存溢出为你收集整理的正则表达式 – 如何在Swift 2中将十六进制字符串解析为ascii等价物全部内容,希望文章能够帮你解决正则表达式 – 如何在Swift 2中将十六进制字符串解析为ascii等价物所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)