Class: CMF::Varint
- Inherits:
-
Object
- Object
- CMF::Varint
- Defined in:
- lib/cmf/varint.rb
Overview
Provides functionaly for serializing and deserializing variable-width encoded integers (varint).
Class Method Summary collapse
-
.deserialize(io) ⇒ Integer
Deserializes a varint into a integer.
-
.serialize(io, n) ⇒ nil
Serializes an integer into a varint.
Class Method Details
permalink .deserialize(io) ⇒ Integer
Deserializes a varint into a integer.
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 |
permalink .serialize(io, n) ⇒ nil
Serializes an integer into a varint.
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 |