class BinData::Primitive
Primitive objects accept all the parameters that BinData::BasePrimitive do.
== Parameters
“0x%x” % u24.value #=> 0x123456
u24.read(“x12x34x56”)
u24 = Uint24be.new
end
end
self.byte3 = v & 0xff
self.byte2 = (v >> 8) & 0xff
self.byte1 = (v >> 16) & 0xff
v = 0xffffff if v > 0xffffff
v = 0 if v < 0
def set(v)
end
(self.byte1 << 16) | (self.byte2 << 8) | self.byte3
def get
uint8 :byte3
uint8 :byte2
uint8 :byte1
class Uint24be < BinData::Primitive
# Unsigned 24 bit big endian integer
ps.value #=> “abc”
ps.read(“003abcde”)
ps.to_binary_s #=> “005hello”
ps = PascalString.new(:initial_value => “hello”)
end
end
self.data = v
def set(v)
end
self.data
def get
string :data, :read_length => :len
uint8 :len, :value => lambda { data.length }
class PascalString < BinData::Primitive
require ‘bindata’
and the #value of the object.
#get and #set method to extract / convert the data between the fields
To define a new data type, set fields as if for Record and add a
For new data types that contain multiple values see BinData::Record.
The data type must contain a primitive value only, i.e numbers or strings.
A Primitive is a declarative way to define a new BinData data type.
def append_field(type, name, params)
def append_field(type, name, params) ensure_valid_name(name) fields.add_field(type, name, params) rescue TypeError raise TypeError, "unknown type '#{type}' for #{self}", caller(2) end
def debug_name_of(child)
def debug_name_of(child) debug_name + "-internal-" end
def endian(endian = nil)
def endian(endian = nil) @endian ||= nil if [:little, :big].include?(endian) @endian = endian elsif endian != nil raise ArgumentError, "unknown value for endian '#{endian}'", caller(1) end @endian end
def ensure_valid_name(name)
def ensure_valid_name(name) if fields.field_names.include?(name) raise SyntaxError, "duplicate field '#{name}' in #{self}", caller(3) end if self.instance_methods.include?(name) raise NameError.new("", name), "field '#{name}' shadows an existing method", caller(3) end end
def fields
def fields unless defined? @fields sanitizer = Sanitizer.new @fields = sanitizer.create_sanitized_fields(endian) end @fields end
def get
Extracts the value for this data object from the fields of the
def get raise NotImplementedError end
def inherited(subclass) #:nodoc:
def inherited(subclass) #:nodoc: # Register the names of all subclasses of this class. register(subclass.name, subclass) end
def initialize(params = {}, parent = nil)
def initialize(params = {}, parent = nil) super(params, parent) @struct = BinData::Struct.new(get_parameter(:struct_params), self) end
def method_missing(symbol, *args)
def method_missing(symbol, *args) name, params = args type = symbol name = name.to_s params ||= {} append_field(type, name, params) end
def method_missing(symbol, *args, &block)
def method_missing(symbol, *args, &block) @struct.__send__(symbol, *args, &block) end
def offset_of(child)
def offset_of(child) offset end
def read_and_return_value(io)
def read_and_return_value(io) @struct.read(io) get end
def sanitize_parameters!(params, sanitizer)
def sanitize_parameters!(params, sanitizer) struct_params = {} struct_params[:fields] = fields struct_params[:endian] = endian unless endian.nil? params[:struct_params] = struct_params end
def sensible_default
def sensible_default get end
def set(v)
def set(v) raise NotImplementedError end
def value_to_binary_string(val)
def value_to_binary_string(val) set(val) @struct.to_binary_s end