質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

5286閲覧

16進数を\xで区切ったバイナリ文字列?に変換したい

akamakku

総合スコア191

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/02/22 06:05

メモリアドレスなどの16進数を\xで区切ったバイナリ文字列に変換したいです。

Ruby

10x0804a020 -> "\x08\x04\xa0\x20" #Big Endian 20x0804a020 -> "\x20\xa0\x04\x08" #Little Endian

最初は単純に16進数の文字列を2文字ずつ区切って\xを挟んでjoinすればいいかなと思っていたんですが、

調べてみると、Array#packで変換するものらしいというところまではわかったんです。
ただテンプレート文字がどれなのかわからなくて質問しました。

instance method Array#pack
を見ると

'V*'を指定すれば32bitでLittleEndianで出来ると思ったのですができません。
おしえていただけますか?

Ruby

1p [0x0804a020].pack('V*') 2=>" \xA0\x04\b"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

生成したいものは、「pした時に\x08\x9Bとなるようなバイナリデータ」なのでしょうか、それとも「本当に'\x08\x9b'のような文字列」なのでしょうか。

前者のようにバイナリデータにしたいのでしたら、packが適切です。ただし、性質上、ふつうにASCIIで表される範囲内の文字はpしてもエスケープはされず、そのまま表示されます(\x20ではなく (スペース)となる)。

また、packのエンディアンの選択は出力結果に関してですので、「上位ビットが先に来る文字列」にしたければビッグエンディアンが正解です。

投稿2017/02/22 06:26

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2017/02/22 06:31

ASCIIで変換されて表示されるのを忘れていました。。。 すみませんでした ありがとうございました
guest

0

p [0x0804a020].pack('V*')

それで出来てます。

pで期待通りの表示にならないのは、pの使うString#inspectメソッドの仕様です。
バイナリの場合、
・印字可能文字はそのまま文字を表示(質問の例だと、\x20空白に)
・そうでないものでエスケープシーケンスに該当するものはそれで(質問の例だと、\x08\b(バックスペース)に)
・そうでないものは\xNN
になります。つまり、pによる表示が期待通りでないだけです。

投稿2017/02/22 06:27

編集2017/02/22 06:29
otn

総合スコア84421

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2017/02/22 06:31

ASCIIで変換されて表示されるのを忘れていました。。。 すみませんでした ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問