我有一个带有十六进制数据的
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 扩展...
谢谢!
尝试:
let asciiString = String(data: data, encoding: .ascii)
print(asciiString)
很抱歉回答我自己的问题,但我只是(意外地)找到了解决我问题的惊人解决方案,希望这会对某人有所帮助。
如果您有一个带有 ASCII 字符串的十六进制表示形式的 NSData 对象,那么您所要做的就是编写
String(data: theNSDataObject, encoding: NSUTF8StringEncoding)
,这就是 ASCII 字符串。
希望这对某人有帮助!
在 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
}