如何在 Swift 中将带有十六进制数据的 NSData 对象转换为 ASCII?

问题描述 投票:0回答:3

我有一个带有十六进制数据的

NSData
对象,我想将其转换为 ASCII 字符串。我见过几个与我类似的问题,但它们要么是 Objective-C 中的,要么是它们将字符串转换为十六进制数据,而不是相反。

我找到了这个函数,但它在Swift 2中不起作用,并且Apple文档没有解释旧的

stride
和新的
stride
之间的区别(它根本没有解释步幅) :

func hex2ascii (example: String) -> String
{

    var chars = [Character]()

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

    let numbers =  stride(from: 0, through: chars.count, by: 2).map{ // error: 'stride(from:through:by:)' is unavailable: call the 'stride(through:by:)' method instead.
        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
}

我不知道

stride
是什么,也不知道它有什么作用。

如何在 Swift 2 中将十六进制转换为 ASCII?也许是 NSData 扩展...

谢谢!

ios string swift hex nsdata
3个回答
6
投票

尝试:

let asciiString = String(data: data, encoding: .ascii)
print(asciiString)

1
投票

很抱歉回答我自己的问题,但我只是(意外地)找到了解决我问题的惊人解决方案,希望这会对某人有所帮助。

如果您有一个带有 ASCII 字符串的十六进制表示形式的 NSData 对象,那么您所要做的就是编写

String(data: theNSDataObject, encoding: NSUTF8StringEncoding)
,这就是 ASCII 字符串。

希望这对某人有帮助!


0
投票

在 swift 2.0 中,stride 成为 Int 上的一个方法,而不是一个独立的方法,所以现在你可以做类似的事情

0.stride(through: 10, by: 2)

所以现在您发布的代码应该是:

func hex2ascii (example: String) -> String {
    var chars = [Character]()

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

    let numbers =  0.stride(through: 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
}
© www.soinside.com 2019 - 2024. All rights reserved.