我一直在尝试将十六进制字符串转换为通过串口转换为可以用作使用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[$0 ..< $0+2]), nil, 16)
}
var final = ""
var i = 0
while i < numbers.count {
final.append(Character(UnicodeScalar(Int(numbers[i]))))
i++
}
return final
}
例如,输入“&lt; 01736c65 65702061 6e642062 61747465 72206c65&gt;”返回这个“6ÆepaæBatte”Æ“'
显然不对,怎么办呢?
答案 0 :(得分:1)
您似乎没有剥离十六进制数字之间的角度括号和空格。
您获得的输出"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进行编码和解码。
答案 1 :(得分:0)
我在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,我已删除它,我得到输出 -
string是sleep and batter le
答案 2 :(得分:0)
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)")
答案 3 :(得分:0)
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
}