def merge(binstr)
return if binstr.empty?
i = 0
while i < binstr.bytesize
id = binstr[i,2]
len = binstr[i + 2,2].to_s.unpack("v")[0]
if id && ID_MAP.member?(id)
field_name = ID_MAP[id].name
if self.member?(field_name)
self[field_name].mergea(binstr[i, len + 4])
else
field_obj = ID_MAP[id].new(binstr[i, len + 4])
self[field_name] = field_obj
end
elsif id
unless self["Unknown"]
s = ""
class << s
alias_method :to_c_dir_bin, :to_s
alias_method :to_local_bin, :to_s
end
self["Unknown"] = s
end
if !len || len + 4 > binstr[i..-1].bytesize
self["Unknown"] << binstr[i..-1]
break
end
self["Unknown"] << binstr[i, len + 4]
end
i += len + 4
end
end