BinDataのchoice構文を使うと、部分的に一致してるスクリプトも一本化できます
使い方
class EData < BinData::Record string :val_a, :length => 8 string :val_b, :length => 4 end class DData < BinData::Record uint8 :val_c rest :rest end class Packet < BinData::Record endian :big string :header, :length => 16 string :datatype, :length => 1 choice :body, :selection => :datatype do status_data 'E' judge_data 'D' end end
といった感じでやると
header = "0013A200FFFFFFFF" datatype = 'E' body = '201504091141545' + "0008" str = header + datatype + body p str pckt = Packet.read(str) p pckt
てな感じで、条件毎にコードを切り分けるロジックを書き下すことができます。
より入り組んだコードを作りたい場合、次のサンプルが参考になります。
A short sample of BinData Ruby gem to pp a constant pool of a Java class file.