この記事は、以下のドキュメントを改変(自分なりに整理)して利用しています。
class Array (Ruby 3.0.0 リファレンスマニュアル)
インスタンスメソッド
pack(template) -> String
pack(template, buffer: String.new) -> String
- 配列の内容をtemplateで指定された文字列にしたがって、バイナリとしてパックした文字列を返す
- templateは型指定文字列とその長さ(省略時は1)を並べたもの
- 長さとして*を指定した場合は「残りのデータすべて」の長さを表す
- templateは型指定文字列とその長さ(省略時は1)を並べたもの
- bufferが指定されている場合、バッファとして使って返り値として返す
- "バッファとして使って"ってどういう意味?
- templateの最初にオフセット(@)が指定されていれば、結果はオフセットの後ろから詰められる
- bufferの元の内容がオフセットより長ければ、オフセットより後ろの部分は上書きされる
- bufferの元の内容がオフセットより短ければ、足りない部分は"\0"で埋められる
irb(main):001:0> ['!'].pack('A') => "!" irb(main):002:0> ['!'].pack('A1') => "!" irb(main):003:0> ['!'].pack('A2') => "! " irb(main):004:0> ['!'].pack('A2').size => 2
irb(main):001:0> ['!'].pack('A', buffer: 'xyz') => "xyz!" irb(main):002:0> ['!'].pack('A1', buffer: 'xyz') => "xyz!" irb(main):003:0> ['!'].pack('A2', buffer: 'xyz') => "xyz! " irb(main):004:0> ['!'].pack('A2', buffer: 'xyz').size => 5
irb(main):001:0> ['!'].pack('@A') => "\x00!" irb(main):002:0> ['!'].pack('@A1') => "\x00!" irb(main):003:0> ['!'].pack('@A2') => "\x00! " irb(main):004:0> ['!'].pack('@A2').size => 3
irb(main):001:0> ['!'].pack('@A', buffer: 'xyz') => "x!" irb(main):002:0> ['!'].pack('@A1', buffer: 'xyz') => "x!" irb(main):003:0> ['!'].pack('@A2', buffer: 'xyz') => "x! " irb(main):004:0> ['!'].pack('@A2', buffer: 'xyz').size => 3
メモ
- 内容もパッと理解できないし、使い所もイメージできない
- バイナリ、オフセット、バッファ、っていう単語の説明を合わせて書いて欲しい
- ドキュメントにはtemplateの説明がたくさん書いてあるが、理解できていないのでまとめない。あとまわし。