Bye Bye Moore

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

「BinData」で階層構造なデータを定義する

あまりに情報がゴチャゴチャして可視性が悪くなった場合、
階層構造にするとなんとかなるケースもあります。

使い方

一つのクラスに記述

class SampleBase < BinData::Record
  uint8 :val_a
  
  struct :nested do
    uint8 :val_b
    uint8 :val_c
  end  
end

とやれば

sb = SampleBase.new(:val_a => 4, :nested => {:val_b => 4, :val_c => 8} )
#>> {:val_a=>4, :nested=>{:val_b=>4, :val_c=>8}}
sb.val_a
#>> 4
sb.nested
#>> {:val_b=>4, :val_c=>8}
sb.nested.val_b
#>> 4
sb.nested.val_c
#>> 8

と、ちゃんと階層構造になっている事が確認できます。

別クラスで定義する

上記のサンプル以外の方法もあります。
ネストするべき物を別クラスで定義して読み込む方法です。

class SampleBase < BinData::Record
  uint8 :val_a
  
  nested :nested
end

class Nested < BinData::Record
  uint8 :val_b
  uint8 :val_c
end