Class: BinData::Buffer

Inherits:
Base
  • Object
show all
Extended by:
DSLMixin
Defined in:
lib/bindata/buffer.rb

Overview

A Buffer is conceptually a substream within a data stream. It has a defined size and it will always read or write the exact number of bytes to fill the buffer. Short reads will skip over unused bytes and short writes will pad the substream with “0” bytes.

require 'bindata'

obj = BinData::Buffer.new(:length => 5, :type => [:string, {:value => "abc"}])
obj.to_binary_s #=> "abc\000\000"

class MyBuffer < BinData::Buffer
  default_parameter :length => 8

  endian :little

  uint16 :num1
  uint16 :num2
  # padding occurs here
end

obj = MyBuffer.read("\001\000\002\000\000\000\000\000")
obj.num1 #=> 1
obj.num1 #=> 2
obj.num_bytes #=> 8

class StringTable < BinData::Record
  endian :little

  uint16 :table_size_in_bytes
  buffer :strings, :length => :table_size_in_bytes do
    array :read_until => :eof do
      uint8 :len
      string :str, :length => :len
    end
  end
end

Parameters

Parameters may be provided at initialisation to control the behaviour of an object. These params are:

:length

The number of bytes in the buffer.

:type

The single type inside the buffer. Use a struct if multiple fields are required.

Instance Attribute Summary

Attributes inherited from Base

#parent

Instance Method Summary collapse

Methods included from DSLMixin

dsl_parser, to_ary, to_str

Methods inherited from Base

#==, #=~, #abs_offset, arg_processor, auto_call_delayed_io, bindata_name, #clear, #debug_name, #eval_parameter, #get_parameter, #has_parameter?, #initialize_with_warning, #inspect, #lazy_evaluator, #new, #num_bytes, #pretty_print, #read, read, register_subclasses, #rel_offset, #safe_respond_to?, #to_binary_s, #to_hex, #to_s, unregister_self, #write

Methods included from AcceptedParametersPlugin

#accepted_parameters, #default_parameters, #mandatory_parameters, #mutually_exclusive_parameters, #optional_parameters

Methods included from CheckOrAdjustOffsetPlugin

included, #initialize_shared_instance

Methods included from RegisterNamePlugin

included, #initialize_shared_instance

Methods included from Framework

#bit_aligned?, #debug_name_of, #offset_of

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args, &block) ⇒ Object

:nodoc:



81
82
83
# File 'lib/bindata/buffer.rb', line 81

def method_missing(symbol, *args, &block) #:nodoc:
  @type.__send__(symbol, *args, &block)
end

Instance Method Details

#assign(val) ⇒ Object



69
70
71
# File 'lib/bindata/buffer.rb', line 69

def assign(val)
  @type.assign(val)
end

#clear?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'lib/bindata/buffer.rb', line 65

def clear?
  @type.clear?
end

#do_num_bytesObject

:nodoc:



97
98
99
# File 'lib/bindata/buffer.rb', line 97

def do_num_bytes #:nodoc:
  eval_parameter(:length)
end

#do_read(io) ⇒ Object

:nodoc:



85
86
87
88
89
# File 'lib/bindata/buffer.rb', line 85

def do_read(io) #:nodoc:
  io.with_buffer(eval_parameter(:length)) do
    @type.do_read(io)
  end
end

#do_write(io) ⇒ Object

:nodoc:



91
92
93
94
95
# File 'lib/bindata/buffer.rb', line 91

def do_write(io) #:nodoc:
  io.with_buffer(eval_parameter(:length)) do
    @type.do_write(io)
  end
end

#initialize_instanceObject



61
62
63
# File 'lib/bindata/buffer.rb', line 61

def initialize_instance
  @type = get_parameter(:type).instantiate(nil, self)
end

#respond_to?(symbol, include_private = false) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


77
78
79
# File 'lib/bindata/buffer.rb', line 77

def respond_to?(symbol, include_private = false) #:nodoc:
  @type.respond_to?(symbol, include_private) || super
end

#snapshotObject



73
74
75
# File 'lib/bindata/buffer.rb', line 73

def snapshot
  @type.snapshot
end