class Ronin::Support::Binary::CTypes::UnboundedArrayType
Represents an unbounded array type.
@api private
@since 1.0.0
Attributes
The type of each element in the unbounded array type.
@return [Type]
Public Class Methods
Initializes the unbounded array type.
@param [Type] type
The type of each element in the unbounded array type.
@raise [ArgumentError]
Cannot initialize a nested {UnboundedArrayType}.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 49 def initialize(type, alignment: nil) if type.kind_of?(UnboundedArrayType) raise(ArgumentError,"cannot initialize a nested #{UnboundedArrayType}") end @type = type @alignment = alignment super( # "T*" syntax only works on individual pack-string codes, # so we only set #pack_string for scalar types that also have # a #pack_string. pack_string: if @type.kind_of?(ScalarType) && @type.pack_string "#{@type.pack_string}*" end ) end
Public Instance Methods
Creates a copy of the unbounded array type with a different {#alignment}.
@param [Integer] new_alignment
The new alignment for the new unbounded array type.
@return [ScalarType]
The new unbounded array type.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 95 def align(new_alignment) self.class.new(@type, alignment: new_alignment) end
The alignment, in bytes, for the unbounded array.
@return [Integer]
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 81 def alignment @alignment || @type.alignment end
Dequeues an array from the flat list of values.
@param [Array] values
The flat array of values.
@return [Array]
The dequeued array.
@api private
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 218 def dequeue_value(values) array = [] until values.empty? array << @type.dequeue_value(values) end return array end
The endianness of each element in the unbounded array.
@return [:little, :big, nil]
Indicates whether each element is little-endian, big-endian, or `nil` if each element has no endianness.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 115 def endian @type.endian end
Enqueues an array of values onto the flat list of values.
@param [Array] values
The flat array of values.
@param [Array] array
The array to enqueue.
@api private
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 201 def enqueue_value(values,array) array.each do |element| @type.enqueue_value(values,element) end end
The “length” of the unbounded array type.
@return [Float::INFINITY]
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 104 def length Float::INFINITY end
Packs an array of values into the type’s binary format.
@param [Array<Integer, Float
, String>] array
The array to pack.
@return [String]
The packed binary data.
@api public
Ronin::Support::Binary::CTypes::AggregateType#pack
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 148 def pack(array) if @pack_string super(array) else buffer = String.new array.each do |element| buffer << @type.pack(element) end return buffer end end
Indicates whether each element is signed.
@return [Boolean]
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 124 def signed? @type.signed? end
The “size” in bytes of the unbounded array type.
@return [Float::INFINITY]
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 72 def size Float::INFINITY end
Unpacks an array of binary data.
@param [String] data
The binary data to unpack.
@return [Array<Integer, Float
, String
, nil>]
The unpacked array.
@api public
Ronin::Support::Binary::CTypes::AggregateType#unpack
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 173 def unpack(data) if @pack_string super(data) else case @type when StringType unpack_strings(data) else type_size = @type.size (0...data.bytesize).step(type_size).map do |offset| @type.unpack(data.byteslice(offset,type_size)) end end end end
Indicates whether each element is unsigned.
@return [Boolean]
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 133 def unsigned? @type.unsigned? end
Private Instance Methods
Unpacks an arbitrary number of null-terminated C Strings.
@param [String] data
The binary encoded data.
@return [Array<String>]
The unpacked Strings.
# File lib/ronin/support/binary/ctypes/unbounded_array_type.rb, line 239 def unpack_strings(data) array = [] length = data.bytesize offset = 0 while offset < length string = @type.unpack(data[offset..]) array << string offset += string.bytesize + 1 end return array end