16進数変換とバイナリ変換

組み込み機器とのシリアル通信を行うプログラム作ってます。
送受信するメッセージがバイナリで非常に苦労したので、内容をまとめます。

環境

16進数変換とバイナリ変換

1バイト単位で配列に格納するとやりやすかったです。

array = []			=> []
msg = []			=> []

array << 5			=> [5]
array << 10			=> [5, 10]
array << 15			=> [5, 10, 15]
array.map! { |s| "%02X" % s }	=> ["05", "0A", "0F"]	# sprintfで16進数文字列に変換
msg << array.join		=> ["050A0F"]		# すべての要素を結合した配列を作成
bin = msg.pack("H*")		=> "\005\n\017"		# Array#packでバイナリ変換

バイナリを16進数に変換

上記例で作成したバイナリを元に戻します。

bin.unpack("H*")		=> ["050a0f"]	# String#unpackでASCII文字列の配列に変換

ポイント

  • 変換したいデータは配列に格納
  • packでバイナリ化
  • unpackで元に戻す
  • sprintfで数値を16進数、2進数に変換する