2014年1月19日日曜日

rubyのpackメソッドとは何だ!?

以前rubyのpackメソッドがわからないという記事を書きましたが、なんとなくわかった気がします。

packメソッドは「配列の内容をtemplateで指定された文字列にしたがってバイナリとしてパックした文字列を返す」という説明がどうにも理解できませんでした。
今でも怪しいですけど。

まあ、要するに文字や数字をバイナリに変換するメソッドと思っていいのでしょう。
templateは変換対象のデータが文字列なのか、16進数なのか等を示していると思います。

unpackはその逆で、バイナリデータを指定の文字や数字に変換します。
以下のプログラムでどう表示されるか試してみました。

(test_pack.rb)
p [0x41,0x42,0xE3,0x81,0x82].pack("C*")
print([0x41,0x61,0xE3,0x81,0x82].pack("C*"),"\n")
puts [0x41,0x61,0xE3,0x81,0x82].pack("C*")

p [0x41,0x61,0xE3,0x81,0x82].pack("C*").unpack("B*")
p ["Aaあ"].pack("A*").unpack("B*")
p ["0100000101100001111000111000000110000010"].pack("B*").unpack("B*")

puts ["0100000101100001111000111000000110000010"].pack("B*")


初めの3行はp、print、putsでどう表示されるかを確認します。
次の3行はpackメソッドで様々な形式のデータをバイナリに変換し、unpackメソッドでバイト表現にしています。

最後はバイト表現のデータをputsメソッドで表示しています。

実行すると、以下のように表示れました。
$ ruby test_pack.rb
"AB\343\201\202"
Aaあ
Aaあ
["0100000101100001111000111000000110000010"]
["0100000101100001111000111000000110000010"]
["0100000101100001111000111000000110000010"]
Aaあ


初めの3行は表示の確認です。
pだと「あ」が8進数で表示されています。
printとputsは文字で表示されています。

そもそも、なぜ文字で表示されるか?という疑問がありましたが、どうやら「p」や「print」「puts」メソッドが人が見やすいように変換しているようです。
ただし、「p」と「print」「puts」は変換の仕方が違うようで、見え方が違っています。

次にさまざまな形式のデータをバイナリに変換し、そのあとバイト表現にしています。
これは16進数、文字列、2進数と表現は違いますが実はすべて同じデータでした。
なので、2バイト表現した値はすべて同じになります。

最後のputsは2バイトで表現されたデータを表示しただけです。
putsメソッドで変換されて「Aaあ」と表示されました。

こんな具合に、いろいろなデータをバイナリに変換するためのメソッドだと理解しました。

間違っていないといいんですけど。

0 件のコメント:

コメントを投稿