Shammer's Philosophy

My private adversaria

文字列を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で読み込み、文字列で表示させられるようなものにしたい。