Class: Rlp::Sedes::BigEndianInt

Inherits:
Object
  • Object
show all
Defined in:
lib/rlp-lite/sedes/big_endian_int.rb

Overview

A serializable, big-endian, unsigned integer type.

Instance Method Summary collapse

Constructor Details

#initialize(size = nil) ⇒ BigEndianInt

Create a serializable, big-endian, unsigned integer.

Parameters:

  • size (Integer) (defaults to: nil)

    the size of the big endian.



12
13
14
# File 'lib/rlp-lite/sedes/big_endian_int.rb', line 12

def initialize(size = nil)
  @size = size
end

Instance Method Details

#_big_endian_to_int(str) ⇒ Integer

Returns an unpacked integer number.

Parameters:

  • str (String)

    big endian to be converted.

Returns:

  • (Integer)

    an unpacked integer number.



64
65
66
# File 'lib/rlp-lite/sedes/big_endian_int.rb', line 64

def _big_endian_to_int(str)
  str.unpack("H*").first.to_i(16)
end

#_int_to_big_endian(num) ⇒ String

Returns packed, big-endian integer string.

Parameters:

  • num (Integer)

    integer to be converted.

Returns:

  • (String)

    packed, big-endian integer string.



53
54
55
56
57
58
# File 'lib/rlp-lite/sedes/big_endian_int.rb', line 53

def _int_to_big_endian( num )
  hex = num.to_s(16)
  hex = "0#{hex}"   if hex.size.odd?

  [hex].pack("H*")    ## note Util.hex_to_bin() "inline" shortcut
end

#deserialize(serial) ⇒ Integer

Deserializes an unsigned integer.

Parameters:

  • serial (String)

    the serialized integer.

Returns:

  • (Integer)

    a number.

Raises:



37
38
39
40
41
42
# File 'lib/rlp-lite/sedes/big_endian_int.rb', line 37

def deserialize(serial)
  raise DeserializationError, "Invalid serialization (wrong size)" if @size && serial.size != @size
  raise DeserializationError, "Invalid serialization (not minimal length)" if !@size && serial.size > 0 && serial[0] == BYTE_ZERO
  serial = serial || BYTE_ZERO
  _big_endian_to_int( serial )
end

#serialize(obj) ⇒ String

Serialize a big-endian integer.

Parameters:

  • obj (Integer)

    the integer to be serialized.

Returns:

  • (String)

    a serialized big-endian integer.

Raises:



23
24
25
26
27
28
29
# File 'lib/rlp-lite/sedes/big_endian_int.rb', line 23

def serialize(obj)
  raise SerializationError, "Can only serialize integers" unless obj.is_a?(Integer)
  raise SerializationError, "Cannot serialize negative integers" if obj < 0
  raise SerializationError, "Integer too large (does not fit in #{@size} bytes)" if @size && obj >= 256 ** @size
  s = obj == 0 ? BYTE_EMPTY : _int_to_big_endian( obj )
  @size ? "#{BYTE_ZERO * [0, @size - s.size].max}#{s}" : s
end