Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

「BinData」で文字列型に関するアレコレ

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"