Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

8進数リテラルや16進数リテラルが混在した文字列を元の16進数な文字列に置換する

SerialPortなどで16進数のパケットを受けると、
こんな感じの文字列が返ってくる事があります。

"~\u0000\u0018\x91\u0000\u0013\xA2\u0000@u"

もとは16進数の数値がズラズラと並んでいるはずなのですが。

てな感じで処理されるようです。
とはいえ、このままだと何書いてるのかわからないですね。
そういう場合はunpackを使ってあげるとよいです

ケース1:一本の文字列として

("H*")で切り出してあげれば、元の16進数の値が呼び出せます
Bindataに渡すなら、これです。

"~\u0000\u0018\x91\u0000\u0013\xA2\u0000@u".unpack("H*")
#=> ["7e0018910013a2004075"]

ケース2:一バイトごとに

一バイトごとに処理したい場合は("C*")

p "~\u0000\u0018\x91\u0000\u0013\xA2\u0000@u".unpack("C*")
#=> [126, 0, 24, 145, 0, 19, 162, 0, 64, 117]