文字列を16進数の配列に変換する
Socket 通信をバイトでやりとりするときに、文字列をそのまま16進数の文字列に変換したいことがあるのでそれを書いてみた。想定では、0から9、aからfのいずれかの1文字、2文字で一つの16進数を表現すること、先頭から読み込むと先頭が1バイトの時に正確な値でなくなるので文字列の最後の2文字を1つの16進数とみなす、というような実装。先頭が1バイトの16進数羅列文字が存在するのかは正直よくわからない。
(defmethod divide-string-2-hex-array ((x string)) (if (<= (length x) 2) x (let ((c (subseq x (- (length x) 2))) (n (subseq x 0 (- (length x) 2)))) (flatten (list (divide-string-2-hex-array n) c)))))
引数は文字列であることがわかりきっているのでdefunでなくdefmethodを使用した。実行例は以下。
? (divide-string-2-hex-array "abc0fa3") ("a" "bc" "0f" "a3") ? (divide-string-2-hex-array "abce0fa3") ("ab" "ce" "0f" "a3") ?
現時点では使用不可な文字(zとか)が入っていても黙って処理する。最終的には、16進数で受け取った文字をACSIIで読み込み、文字列で表示させられるようなものにしたい。