我有一个字符串格式的ASCII代码序列,例如(7297112112121326610511411611610410097121)。如何将其转换为文本格式。
我尝试了以下代码:
func convertAscii(asciiStr: String) {
var asciiString = ""
for asciiChar in asciiStr {
if let number = UInt8(asciiChar, radix: 2) { // Cannot invoke initializer for type 'UInt8' with an argument list of type '(Character, radix: Int)'
print(number)
let character = String(describing: UnicodeScalar(number))
asciiString.append(character)
}
}
}
convertAscii(asciiStr: "7297112112121326610511411610410097121")
但是在if let number
行中出现错误。
答案 0 :(得分:2)
如前所述,十进制ASCII值在0-255范围内,可以超过2位数字
基于Sulthan的答案,并假设文本中没有字符<32(0x20)和> 199(0xc7),此方法将检查裁剪后的字符串的第一个字符。如果为“ 1”,则该字符由3位数字表示,否则为2。
func convertAscii(asciiStr: String) {
var source = asciiStr
var result = ""
while source.count >= 2 {
let digitsPerCharacter = source.hasPrefix("1") ? 3 : 2
let charBytes = source.prefix(digitsPerCharacter)
source = String(source.dropFirst(digitsPerCharacter))
let number = Int(charBytes)!
let character = UnicodeScalar(number)!
result += String(character)
}
print(result) // "Happy Birthday"
}
convertAscii(asciiStr: "7297112112121326610511411610410097121")
答案 1 :(得分:0)
如果我们认为字符串是由字符组成的,其中每个字符都由2个十进制字母表示,那么类似的方法就可以工作(这只是一个示例,不是最佳选择)。
func convertAscii(asciiStr: String) {
var source = asciiStr
var characters: [String] = []
let digitsPerCharacter = 2
while source.count >= digitsPerCharacter {
let charBytes = source.prefix(digitsPerCharacter)
source = String(source.dropFirst(digitsPerCharacter))
let number = Int(charBytes, radix: 10)!
let character = UnicodeScalar(number)!
characters.append(String(character))
}
let result: String = characters.joined()
print(result)
}
convertAscii(asciiStr: "7297112112121326610511411610410097121")
但是,格式本身是模棱两可的,因为ASCII字符可以使用1到3个十进制数字,因此要正确解析,您需要所有字符具有相同的长度(例如1
应该为001
)。
请注意,我总是使用相同数量的字母,然后将它们转换为数字,然后创建一个数字字符。