如何在SWIFT 2中将祸不单行字符串解析为ASCII等效项 [英] How to parse a string of hex into ascii equivalent in Swift 2

查看:45
本文介绍了如何在SWIFT 2中将祸不单行字符串解析为ASCII等效项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在SWIFT 2中,将祸不单行字符串转换为ASCII等效字符串的最佳方式是什么。

<%2>已给定
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

伪代码:

  • 去掉所有垃圾(&Q;)、逗号等(&Q;)
  • 获取2个字符块,然后使用strtoul
  • 将这些字符转换为INT等效值(&Q)
  • 生成字符数组并将其合并为字符串

部分实现

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😈🇩🇪0x63"

SWIFT 5.1更新:

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.range(at: 2)), radix: 16)!)!)
    }
    return String(characters)
}

这篇关于如何在SWIFT 2中将祸不单行字符串解析为ASCII等效项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆