class Ronin::Support::Binary::CTypes::ArrayType
Represents a bounded array type.
@api private
@since 1.0.0
Attributes
The length of the array type.
@return [Integer]
The size of the array type.
@return [Integer]
The type of each element in the array type.
@return [Type]
Public Class Methods
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 62 def initialize(type,length, alignment: nil) if type.kind_of?(UnboundedArrayType) raise(ArgumentError,"cannot initialize an #{self.class} of #{UnboundedArrayType}") end @type = type @length = length @size = @type.size * @length @alignment = alignment super( pack_string: if @type.pack_string @type.pack_string * @length end ) end
Initializes the array type.
@param [Type] type
The type of each element in the array type.
@param [Integer] length
The length of the array type.
@param [Integer, nil] alignment
Custom type alignment to override the type's alignment.
Public Instance Methods
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 118 def align(new_alignment) self.class.new(@type,@length, alignment: new_alignment) end
Creates a copy of the array type with a different {#alignment}.
@param [Integer] new_alignment
The new alignment for the new array type.
@return [ScalarType]
The new array type.
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 105 def alignment @alignment || @type.alignment end
The alignment, in bytes, for the array type.
@return [Integer]
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 222 def dequeue_value(values) ::Array.new(@length) do @type.dequeue_value(values) end 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
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 96 def endian @type.endian end
The endianness of each element in the bounded array type.
@return [:little, :big, nil]
Indicates whether each element is little-endian, big-endian, or `nil` if each element has no endianness.
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 203 def enqueue_value(values,array) @length.times do |index| value = array[index] || @type.uninitialized_value @type.enqueue_value(values,value) end 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
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 151 def pack(array) if @pack_string super(array) else buffer = String.new @length.times do |index| value = array[index] || @type.uninitialized_value buffer << @type.pack(value) end return buffer end 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
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 127 def signed? @type.signed? end
Indicates whether each element is signed.
@return [Boolean]
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 85 def uninitialized_value ::Array.new(@length) { @type.uninitialized_value } end
Initializes an Array
of uninitialized values.
@return [::Array]
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 178 def unpack(data) if @pack_string super(data) else type_size = @type.size ::Array.new(@length) do |index| offset = index * type_size @type.unpack(data.byteslice(offset,type_size)) end end 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
Source
# File lib/ronin/support/binary/ctypes/array_type.rb, line 136 def unsigned? @type.unsigned? end
Indicates whether each element is unsigned.
@return [Boolean]