Module: Wexpr::UVLQ64

Defined in:
lib/wexpr/uvlq64.rb

Overview

Helpers for managing VLQ 64bit binary

Class Method Summary collapse

Class Method Details

.byte_size(value) ⇒ Object

Return the number of bytes which is needed to store a number in the UVLQ64



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/wexpr/uvlq64.rb', line 10

def self.byte_size(value)
  # we get 7 bits per byte. 2^7 for each.
  case value
    when 0 ... 128 then return 1 # 2^7
    when 128 ... 16384 then return 2 # 2^14
    when 16384 ... 2097152 then return 3 # 2^21
    when 2097152 ... 268435456 then return 4 # 2^28
    when 268435456 ... 34359738368 then return 5 # 2^35
    when 34359738368 ... 4398046511104 then return 6 # 2^42
    when 4398046511104 ... 562949953421312 then return 7 # 2^49
    when 562949953421312 ... 72057594037927936 then return 8 # 2^56
    when 72057594037927936 ... 9223372036854775808 then return 9 # 2^63
    else
      return 10 # 2^64+
  end
end

.read(buffer) ⇒ Object

Read a UVLQ64 big endian from the given buffer. binary -> value Returns the result along with the rest of the buffer not processed



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/wexpr/uvlq64.rb', line 49

def self.read(buffer)
  r = 0
  bufferPos = 0
  bufferLen = buffer.size
  
  loop do
    if bufferPos == bufferLen
      raise StandardError("Ran out of buffer processing UVLQ64")
    end
    
    c = buffer[bufferPos].unpack('C')[0]
    r = (r << 7) | (c & 127)
    
    isEnd = (c & 128) == 0
    bufferPos += 1
    break if isEnd
  end
  
  return r, buffer[bufferPos..-1]
end

.write(value) ⇒ Object

Write a UVLQ64 (big endian) to a buffer. value -> binary.



30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/wexpr/uvlq64.rb', line 30

def self.write(value)
  bytesNeeded = byte_size(value)
  
  buf = []
  
  i = bytesNeeded - 1
  for j in 0 .. i
    buf << (((value >> ((i - j) * 7)) & 127) | 128)
  end
  
  buf[i] ^= 128
  
  return buf.pack('C*')
end