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進数に変換する