【问题标题】:how do i convert a hex string to its unicode ascii equivalent in swift?如何在 swift 中将十六进制字符串转换为其 unicode ascii 等价物?
【发布时间】:2015-08-27 21:42:22
【问题描述】:

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

例如,如果这是字符串:“”

我想把它转换成一个写着“sleep and bake le”的字符串

注意:我们必须删除字符串前端和末端的胡萝卜。

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

我已经走到这一步了,

func hex2ascii (example: String) -> String {

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

var final = ""
var i = 0

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

例如,输入“”返回此`“6Æep aæBatte”Æ“'

显然不对,如何解决这个问题?

【问题讨论】:

标签: string swift unicode hex ascii


【解决方案1】:

看来你没有去掉角括号和十六进制数字之间的空格。

"6Æep aæBatte"Æ"corresponds 的输出对应于这个 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进行编码和解码。

【讨论】:

  • 这正是问题所在。我把这些脱掉了,它似乎工作了!太棒了!
【解决方案2】:

当我在 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[$0 ..< $0+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 在您的输入中,我已将其删除并得到输出-

字符串是睡眠和连击乐

【讨论】:

    【解决方案3】:
    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)")
    

    【讨论】:

    • 与 Xcode 版本 7.3.1 (7D1014) 略有不同的版本
    【解决方案4】:

    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[$0 ..< $0+2]), nil, 16)
        }
    
        var final = ""
        var i = 0
    
        while i < numbers.count {
            final.append(Character(UnicodeScalar(Int(numbers[i]))!))
            i += 1
        }
    
        return final
    }
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 2021-10-14
      • 2014-12-22
      • 2011-11-21
      相关资源
      最近更新 更多