class Ronin::Support::Binary::CTypes::ArrayType

Represents a bounded array type.

@api private

@since 1.0.0

Attributes

length[R]

The length of the array type.

@return [Integer]

size[R]

The size of the array type.

@return [Integer]

type[R]

The type of each element in the array type.

@return [Type]

Public Class Methods

new(type,length, alignment: nil) click to toggle source

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.
Calls superclass method
# 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

Public Instance Methods

align(new_alignment) click to toggle source

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.
# File lib/ronin/support/binary/ctypes/array_type.rb, line 118
def align(new_alignment)
  self.class.new(@type,@length, alignment: new_alignment)
end
alignment() click to toggle source

The alignment, in bytes, for the array type.

@return [Integer]

# File lib/ronin/support/binary/ctypes/array_type.rb, line 105
def alignment
  @alignment || @type.alignment
end
dequeue_value(values) click to toggle source

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/array_type.rb, line 222
def dequeue_value(values)
  ::Array.new(@length) do
    @type.dequeue_value(values)
  end
end
endian() click to toggle source

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.
# File lib/ronin/support/binary/ctypes/array_type.rb, line 96
def endian
  @type.endian
end
enqueue_value(values,array) click to toggle source

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/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
pack(array) click to toggle source

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

# 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
signed?() click to toggle source

Indicates whether each element is signed.

@return [Boolean]

# File lib/ronin/support/binary/ctypes/array_type.rb, line 127
def signed?
  @type.signed?
end
uninitialized_value() click to toggle source

Initializes an Array of uninitialized values.

@return [::Array]

# File lib/ronin/support/binary/ctypes/array_type.rb, line 85
def uninitialized_value
  ::Array.new(@length) { @type.uninitialized_value }
end
unpack(data) click to toggle source

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

# 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
unsigned?() click to toggle source

Indicates whether each element is unsigned.

@return [Boolean]

# File lib/ronin/support/binary/ctypes/array_type.rb, line 136
def unsigned?
  @type.unsigned?
end