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.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.

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:



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

Returns:

  • (Boolean)


71
72
73
# File 'lib/bindata/buffer.rb', line 71

def clear?
  @type.clear?
end

#do_num_bytesObject

:nodoc:



103
104
105
# File 'lib/bindata/buffer.rb', line 103

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

#do_read(io) ⇒ Object

:nodoc:



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

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

#do_write(io) ⇒ Object

:nodoc:



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

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

#initialize_instanceObject



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

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

#raw_num_bytesObject

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?(symbol, include_private = false) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


83
84
85
# File 'lib/bindata/buffer.rb', line 83

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

#snapshotObject



79
80
81
# File 'lib/bindata/buffer.rb', line 79

def snapshot
  @type.snapshot
end