質問: メモリアドレスなどの16進数を\xで区切ったバイナリ文字列に変換したいです。 ``` 0x0804a020 -> "\x08\x04\xa0\x20" #Big Endian 0x0804a020 -> "\x20\xa0\x04\x08" #Little Endian ``` 最初は単純に16進数の文字列を2文字ずつ区切って\xを挟んでjoinすればいいかなと思っていたんですが、 調べてみると、Array#packで変換するものらしいというところまではわかったんです。 ただテンプレート文字がどれなのかわからなくて質問しました。 instance method Array#pack を見ると 'V*'を指定すれば32bitでLittleEndianで出来ると思ったのですができません。 おしえていただけますか? ``` p [0x0804a020].pack('V*') =>" \xA0\x04\b" ```
回答: > > p [0x0804a020].pack('V*') > > > それで出来てます。 `p`で期待通りの表示にならないのは、`p`の使う`String#inspect`メソッドの仕様です。 バイナリの場合、 ・印字可能文字はそのまま文字を表示(質問の例だと、`\x20`が`空白`に) ・そうでないものでエスケープシーケンスに該当するものはそれで(質問の例だと、`\x08`が`\b`(バックスペース)に) ・そうでないものは`\xNN`で になります。つまり、`p`による表示が期待通りでないだけです。