加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何在Swift 2中将十六进制字符串解析为ascii等价

发布时间:2020-12-14 18:04:07 所属栏目:百科 来源:网络整理
导读:在 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" 我们想运行一个吐出的函数(或字符串扩展名):’ML
在 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)
}

这部分实现是否在正确的路径上?如果是这样,处理分块的最佳方法是什么?

解决方法

使用正则表达式匹配是一种可能的方法来提取
字符串中的“十六进制数字”.
您正在寻找的是一个可选的“0x”,紧接着是
2位十六进制数字相应的正则表达式模式是“(0x)?([0-9a-f] {2})”.

然后你可以将每个匹配转换为一个Character,最后连接
String中的字符,与您的“部分实现”非常相似.您可以使用UInt32代替strtoul()
初始化

init?(_ text: String,radix: Int = default)

这是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)
}

(有关转换为NSString的说明,请参阅Swift extract regex matches.)

请注意,此功能非常宽松,只需搜索
2位十六进制字符串并忽略所有其他字符,所以这个
也会被接受:

let str6 = "4d+-4c*/4e                        

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读