Class: BinData::Buffer
- 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
Instance Method Summary collapse
- #assign(val) ⇒ Object
- #clear? ⇒ Boolean
-
#do_num_bytes ⇒ Object
:nodoc:.
-
#do_read(io) ⇒ Object
:nodoc:.
-
#do_write(io) ⇒ Object
:nodoc:.
- #initialize_instance ⇒ Object
-
#method_missing(symbol, *args, &block) ⇒ Object
:nodoc:.
-
#respond_to?(symbol, include_private = false) ⇒ Boolean
:nodoc:.
- #snapshot ⇒ Object
Methods included from DSLMixin
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
65 66 67 |
# File 'lib/bindata/buffer.rb', line 65 def clear? @type.clear? end |
#do_num_bytes ⇒ Object
: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_instance ⇒ Object
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:
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 |
#snapshot ⇒ Object
73 74 75 |
# File 'lib/bindata/buffer.rb', line 73 def snapshot @type.snapshot end |