「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