Module: KRPC::ProtobufUtils::Decoder

Defined in:
lib/krpc/protobuf_utils.rb

Class Method Summary collapse

Class Method Details

.decode(bytes, type) ⇒ Object

Raises:

  • (RuntimeError)


16
17
18
19
20
# File 'lib/krpc/protobuf_utils.rb', line 16

def decode(bytes, type)
  meth_name = "decode_" + type
  raise RuntimeError.new("Unsupported type #{type}") unless respond_to?(meth_name)
  send(meth_name, bytes)
end

.decode_bool(bytes) ⇒ Object



57
58
59
# File 'lib/krpc/protobuf_utils.rb', line 57

def decode_bool(bytes)
  decode_varint(bytes) != 0
end

.decode_bytes(bytes) ⇒ Object



64
65
66
67
# File 'lib/krpc/protobuf_utils.rb', line 64

def decode_bytes(bytes)
  size, pos = decode_varint_pos(bytes)
  bytes[pos..(pos+size)].bytes
end

.decode_double(bytes) ⇒ Object



54
55
56
# File 'lib/krpc/protobuf_utils.rb', line 54

def decode_double(bytes)
  bytes.unpack('E').first
end

.decode_float(bytes) ⇒ Object



51
52
53
# File 'lib/krpc/protobuf_utils.rb', line 51

def decode_float(bytes)
  bytes.unpack('e').first
end

.decode_signed_varint(bytes) ⇒ Object Also known as: decode_int32, decode_int64



39
40
41
42
43
# File 'lib/krpc/protobuf_utils.rb', line 39

def decode_signed_varint(bytes)
  result = decode_varint(bytes)
  result -= (1 << 64) if result > 0x7fffffffffffffff
  result
end

.decode_string(bytes) ⇒ Object



60
61
62
63
# File 'lib/krpc/protobuf_utils.rb', line 60

def decode_string(bytes)
  size, pos = decode_varint_pos(bytes)
  bytes[pos..(pos+size)].force_encoding(Encoding::UTF_8)
end

.decode_varint(bytes) ⇒ Object Also known as: decode_uint32, decode_uint64



23
24
25
# File 'lib/krpc/protobuf_utils.rb', line 23

def decode_varint(bytes)
  decode_varint_pos(bytes)[0]
end

.decode_varint_pos(bytes) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/krpc/protobuf_utils.rb', line 26

def decode_varint_pos(bytes)
  pos = 0
  result = 0
  shift = 0
  loop do
    byte = bytes[pos].ord
    pos += 1
    result |= (byte & 0b0111_1111) << shift
    return [result, pos] if (byte & 0b1000_0000) == 0
    shift += 7
    raise(RuntimeError, "too many bytes when decoding varint") if shift >= 64
  end
end