BinDataの文字列型は自由度が高く、うまく使いこなせば楽ができます。
つかいかた
長さを指定する
長さを指定するなら、lenghtをもたせます。
obj = BinData::String.new(:length => 6) obj.read("abcdefghij") obj #=> "abcdef"
不足はヌルうめ
文字が不足していた場合はヌルうめしてくれます。
obj = BinData::String.new(:length => 6) obj.assign("abcd") obj #=> "abcd\000\000"
過剰は捨てる
逆に、多い場合は捨てられます。
obj = BinData::String.new(:length => 6) obj.assign("abcdefghij") obj #=> "abcdef"
手前からヌルうめ
文字が不足している場合の埋め合わせを左詰めにしたい場合はpad_frontオプションをつけてあげれば良いです。
obj = BinData::String.new(:length => 6, :pad_front => true) obj.assign("abcd") obj.snapshot #=> "\000\000abcd"
埋め文字を決める
状況によっては、"A"で埋めろ等々の理不尽な要求もありますよね。
その場合はpad_byteです。
obj = BinData::String.new(:length => 6, :pad_byte => 'A') obj.assign("abcd") obj.snapshot #=> "abcdAA" obj.to_binary_s #=> "abcdAA"
ヌル文字終端
C言語的にヌル文字で終端したい場合は、Stringz型を使います
sz = BinData::Stringz.new "hoge" sz.snapshot #>> "hoge" >> sz.to_binary_s #>> "hoge\x00"
ヌル文字終端で埋め文字は指定不能
ヌル文字補完のStringz型では、pad_byteは無効です
sz = BinData::Stringz.new "hoge", :length => 6, :pad_byte => "F" sz.to_binary_s #>> "hoge\x00"