16進数をASCII codeに変換する
16進数を10進数に変換する方法などはたくさん記事になっていたのですが、ASCII codeの変換方法が全然見つからず困りました。
1byteずつに変換していく方法
String(bytes: [0x68, 0x65, 0x6c, 0x6c, 0x6f], encoding: .utf8)
一気に変換する
stackOverflowに同じような質問があり、回答も付いていました
func hexStringtoAscii(_ hexString : String) -> String {
let nsString = hexString as NSString
//0xをがついていているか付いていないかを正規表現で表している
let pattern = "(0x)?([0-9a-f]{2})"
let regex = try! NSRegularExpression(pattern: pattern, options: .caseInsensitive)
let matches = regex.matches(in: hexString, options: [], range: NSMakeRange(0, nsString.length))
let characters = matches.map {
Character(UnicodeScalar(UInt32(nsString.substring(with: $0.range(at: 2)), radix: 16)!)!)
}
return String(characters)
}
何をやっているのか
stacoverflowからお借りしたコードにそのまま16進数を投げるとASCIIコードに変換してくれるんですが、何をしているのかすぐにはわかりませんでした。
まず、patternで宣言しているのは正規表現です。
let pattern = "(0x)?([0-9a-f]{2})"
0xが付いていたら無視してその後を16進数に当てはまる数を2文字づつ繰り返すというものです。
regexでpatternに当てはまるかをSwiftで使えるようにし、matchesに当てはまるものを格納しています。
let matches = regex.matches(in: hexString, options: [], range: NSMakeRange(0, nsString.length))
最後に2文字づつASCIIコードに変換して終わりです。
let characters = matches.map {
Character(UnicodeScalar(UInt32(nsString.substring(with: $0.range(at: 2)), radix: 16)!)!)
}
世の中にはすごい人がいるなぁと実感しました。