A Primitive is a declarative way to define a new BinData data type. The data type must contain a primitive value only, i.e numbers or strings. For new data types that contain multiple values see BinData::Record.
To define a new data type, set fields as if for Record and add a get and set method to extract / convert the data between the fields and the value of the object.
require 'bindata' class PascalString < BinData::Primitive uint8 :len, :value => lambda { data.length } string :data, :read_length => :len def get self.data end def set(v) self.data = v end end ps = PascalString.new(:initial_value => "hello") ps.to_binary_s #=> "\005hello" ps.read("\003abcde") ps #=> "abc" # Unsigned 24 bit big endian integer class Uint24be < BinData::Primitive uint8 :byte1 uint8 :byte2 uint8 :byte3 def get (self.byte1 << 16) | (self.byte2 << 8) | self.byte3 end def set(v) v = 0 if v < 0 v = 0xffffff if v > 0xffffff self.byte1 = (v >> 16) & 0xff self.byte2 = (v >> 8) & 0xff self.byte3 = v & 0xff end end u24 = Uint24be.new u24.read("\x12\x34\x56") "0x%x" % u24 #=> 0x123456
Primitive objects accept all the parameters that BinData::BasePrimitive do.
# File lib/bindata/primitive.rb, line 87 def assign(val) super(val) set(_value) @value = get end
# File lib/bindata/primitive.rb, line 102 def do_num_bytes set(_value) @struct.do_num_bytes end
Generated with the Darkfish Rdoc Generator 2.