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)!)!)
        }

世の中にはすごい人がいるなぁと実感しました。

Swift

前の記事

iOSDFUライブラリを使う
Swift

次の記事

UISwitchでRandomWalk