Bye Bye Moore

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

「BinData」Choice構文で、条件毎に構造を変える

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.