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.raw_num_bytes #=> 4
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.
Defined Under Namespace
Classes: BufferIO
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:.
-
#raw_num_bytes ⇒ Object
The number of bytes used, ignoring the padding imposed by the buffer.
-
#respond_to_missing?(symbol, include_all = 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 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:
87 88 89 |
# File 'lib/bindata/buffer.rb', line 87 def method_missing(symbol, *args, &block) # :nodoc: @type.__send__(symbol, *args, &block) end |
Instance Method Details
#assign(val) ⇒ Object
75 76 77 |
# File 'lib/bindata/buffer.rb', line 75 def assign(val) @type.assign(val) end |
#clear? ⇒ Boolean
71 72 73 |
# File 'lib/bindata/buffer.rb', line 71 def clear? @type.clear? end |
#do_num_bytes ⇒ Object
:nodoc:
105 106 107 |
# File 'lib/bindata/buffer.rb', line 105 def do_num_bytes # :nodoc: eval_parameter(:length) end |
#do_read(io) ⇒ Object
:nodoc:
91 92 93 94 95 96 |
# File 'lib/bindata/buffer.rb', line 91 def do_read(io) # :nodoc: buf_len = eval_parameter(:length) io.transform(BufferIO.new(buf_len)) do |transformed_io, _| @type.do_read(transformed_io) end end |
#do_write(io) ⇒ Object
:nodoc:
98 99 100 101 102 103 |
# File 'lib/bindata/buffer.rb', line 98 def do_write(io) # :nodoc: buf_len = eval_parameter(:length) io.transform(BufferIO.new(buf_len)) do |transformed_io, _| @type.do_write(transformed_io) end end |
#initialize_instance ⇒ Object
62 63 64 |
# File 'lib/bindata/buffer.rb', line 62 def initialize_instance @type = get_parameter(:type).instantiate(nil, self) end |
#raw_num_bytes ⇒ Object
The number of bytes used, ignoring the padding imposed by the buffer.
67 68 69 |
# File 'lib/bindata/buffer.rb', line 67 def raw_num_bytes @type.num_bytes end |
#respond_to_missing?(symbol, include_all = false) ⇒ Boolean
:nodoc:
83 84 85 |
# File 'lib/bindata/buffer.rb', line 83 def respond_to_missing?(symbol, include_all = false) # :nodoc: @type.respond_to?(symbol, include_all) || super end |
#snapshot ⇒ Object
79 80 81 |
# File 'lib/bindata/buffer.rb', line 79 def snapshot @type.snapshot end |