我如何将十六进制字符串转换为其在 swift 中等效的 unicode ascii?

how do i convert a hex string to its unicode ascii equivalent in swift?

我一直在尝试将我通过串行获取的十六进制字符串转换为我可以使用 swift 用作 ascii 字符串的内容。

例如,如果这是字符串:“<01736c65 65702061 6e642062 61747465 72206c65>”

我想将其转换为 "sleep and batter le"

的字符串

注意:我们必须移除绳子前端和末端的胡萝卜。

我已经为此做了两天,但没有一个优雅或简单的解决方案。任何想法将不胜感激。

我已经走到这一步了,

func hex2ascii (example: String) -> String {

let chars = Array(example)
let numbers = map (stride(from: 0, to: chars.count, by: 2)) {
    strtoul(String(chars[[=11=] ..< [=11=]+2]), nil, 16)
}

var final = ""
var i = 0

while i < numbers.count {
    final.append(Character(UnicodeScalar(Int(numbers[i]))))
    i++
}
return final
}

例如,输入“<01736c65 65702061 6e642062 61747465 72206c65>”returns this`"6Æep aæBatte"Æ"'

显然不对,如何解决?

您似乎没有去除十六进制数字之间的尖括号和空格。

您获得的输出"6Æep aæBatte"Æ"对应于此 unicode 实体(添加了空格):

%22 %36 %C6 %65 %70 %20 %61 %E6 %62 %61 %74 %74 %65 %22 %C6 %22

我不知道双引号是从哪里来的,但是 将它与原始的十六进制字符串进行比较,您可以看到空格使您失去了一个数字,取代了数字。

<01736c65 65702061 6e642062 61747465 72206c65>

注意字符转换产生的字符 %36、%c6 和 %E6。

我使用了this page编码和解码。

我在 Xcode 7 beta 和 Swift 2.0

运行 中对您的代码进行了轻微修改
func hex2ascii (example: String) -> String
{

    var chars = [Character]()

    for c in example.characters
    {
        chars.append(c)
    }

    let numbers =  stride(from: 0, to: chars.count, by: 2).map{
                strtoul(String(chars[[=10=] ..< [=10=]+2]), nil, 16)
    }

    var final = ""
    var i = 0

    while i < numbers.count {
        final.append(Character(UnicodeScalar(Int(numbers[i]))))
        i++
    }

    return final
}

var str = hex2ascii("736c65657020616e6420626174746572206c65")

print("string is \(str)")

这是打印所需的输出,但看到输入,有一个无关的 01 在你的输入中,我已经删除了它,我得到了输出-

string is sleep and batter le

func hex2ascii (example: String) -> String
{
var numbers = [UInt8]()
var from = example.startIndex
while from != example.endIndex
{
    let to = from.advancedBy(2, limit: example.endIndex)
    numbers.append(UInt8(example[from ..< to], radix: 16) ?? 0)
    from = to
}

var final = ""
var i = 0

while i < numbers.count {
    final.append(Character(UnicodeScalar(Int(numbers[i]))))
    i+=1
}

return final
}

var str = hex2ascii("736c65657020616e6420626174746572206c65")

print("string is \(str)")

SWIFT 4:

func hex2ascii (example: String) -> String {

    var chars = [Character]()

    for c in example.characters {
        chars.append(c)
    }

    let numbers =  stride(from: 0, to: chars.count, by: 2).map{
        strtoul(String(chars[[=10=] ..< [=10=]+2]), nil, 16)
    }

    var final = ""
    var i = 0

    while i < numbers.count {
        final.append(Character(UnicodeScalar(Int(numbers[i]))!))
        i += 1
    }

    return final
}