module KRPC::ProtobufUtils::Decoder

Public Class Methods

decode(bytes, type) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 8
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) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 49
def decode_bool(bytes)
  decode_varint(bytes) != 0
end
decode_bytes(bytes) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 56
def decode_bytes(bytes)
  size, pos = decode_varint_pos(bytes)
  bytes[pos..(pos+size)].bytes
end
decode_double(bytes) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 46
def decode_double(bytes)
  bytes.unpack('E').first
end
decode_float(bytes) click to toggle source

based on: github.com/ruby-protobuf/protobuf/search?q=pack

# File lib/krpc/protobuf_utils.rb, line 43
def decode_float(bytes)
  bytes.unpack('e').first
end
decode_sint32(bytes)
decode_sint64(bytes)
decode_string(bytes) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 52
def decode_string(bytes)
  size, pos = decode_varint_pos(bytes)
  bytes[pos..(pos+size)].force_encoding(Encoding::UTF_8)
end
decode_uint32(bytes)
Alias for: decode_varint
decode_uint64(bytes)
Alias for: decode_varint
decode_varint(bytes) click to toggle source
Also aliased as: decode_uint32, decode_uint64
decode_varint_pos(bytes) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 18
def decode_varint_pos(bytes)
  raise(RuntimeError, "can't decode varint from empty byte buffer") if bytes.empty?
  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
decode_zigzaged_varint(bytes) click to toggle source
# File lib/krpc/protobuf_utils.rb, line 32
def decode_zigzaged_varint(bytes)
  zigzaged = decode_varint(bytes)
  (zigzaged >> 1) ^ -(zigzaged & 1)
end
Also aliased as: decode_sint32, decode_sint64