にたまごほうれん草アーカイブ

はてなダイアリーで書いてた「にたまごほうれん草」という日記のアーカイブです。現在は「にたまごほうれん草ブログ」を運営中です。

Rubyでバイナリデータを扱う

Stringクラスにバイナリデータを突っ込んでも正しく動作するようです。(というか、Stringクラス以外でどうすればいいのかよくわからないのですが)

data = []
data << [1].pack('c') # ASCII
data << [234].pack('N') # ネットワークバイトオーダー(32bit / unsigned long)
data << "test"
data.join

としても、元のバイト列は失われない。当然なのかもしれないけど、C言語の文字列に慣れるとなんか不安。まだちゃんと検証できてないのですが。
結果のバイナリコードはこんな感じ。

0100 0000 ea74 6573 74

Rubyリファレンス packテンプレート文字列では、

[0,1,-1].pack("N*") => "\000\000\000\000\000\000\000\001\377\377\377\377"

と書いてあるが、ちゃんと最初に1バイト分0の列があることに注意。