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_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_varint(bytes)
click to toggle source
based on: developers.google.com/protocol-buffers/docs/encoding#varints & www.rubydoc.info/gems/ruby-protocol-buffers/1.0.1/ProtocolBuffers/Varint#decode-class_method & github.com/google/protobuf/blob/master/python/google/protobuf/internal/decoder.py#L136
# File lib/krpc/protobuf_utils.rb, line 15 def decode_varint(bytes) decode_varint_pos(bytes)[0] end
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