Class: CMF::Varint

Inherits:
Object
  • Object
show all
Defined in:
lib/cmf/varint.rb

Overview

Provides functionaly for serializing and deserializing variable-width encoded integers (varint).

Class Method Summary collapse

Class Method Details

.deserialize(io) ⇒ Integer

Deserializes a varint into a integer.

Parameters:

  • io (StringIO)

    The IO stream that will be read from to deserialize.

Returns:

  • (Integer)

    The deserialized integer.

Raises:



35
36
37
38
39
40
41
42
43
# File 'lib/cmf/varint.rb', line 35

def self.deserialize(io)
  result = 0
  io.each_byte do |byte|
    result = (result << 7) | (byte & 0x7F)
    return result if (byte & 0x80) == 0
    result += 1
  end
  raise CMF::MalformedMessageError, "Unexpected end of stream"
end

.serialize(io, n) ⇒ nil

Serializes an integer into a varint.

Parameters:

  • io (StringIO)

    The IO stream where the serialized varint will be written.

  • n (Integer)

    The integer to serialize.

Returns:

  • (nil)


12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/cmf/varint.rb', line 12

def self.serialize(io, n)
  n.is_a?(Integer) or raise TypeError, "Invalid Varint value #{n}. Must be an integer"
  n >= 0 or raise ArgumentError, "Invalid Varint value #{n}. Must be >= 0"

  data = []
  mask = 0
  begin
    data.push((n & 0x7F) | mask)
    n = (n >> 7) - 1
    mask = 0x80
  end while n >= 0

  data.reverse_each do |byte|
    io.putc(byte)
  end

  nil
end