Bye Bye Moore

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

「BinData」で可変長なフィールドを定義する際はread_lengthが使える

「BinData」で可変長なフィールドを定義する際はread_lengthやlambda式が使えます。

lambda

class Hoge < BinData::Record
  endian :big
  uint8 :len, :value => lambda { data.length }
  string :data, :read_length => :len
end

と定義した場合、「data」フィールドさえ定義してあげれば、長さを読み取って突っ込んでくれます。

h = Hoge.new
h.data = "42"
p h
# {:len=>2, :data=>"42"}

読み込み時はread_length

逆に、受け取る値で長さの指定がある場合はread_lengthが使えます

class Fuga < BinData::Record
  uint8  :len
  string :data, :read_length => :len
end