Module: KRPC::ProtobufUtils::Decoder
- Defined in:
- lib/krpc/protobuf_utils.rb
Class Method Summary collapse
- .decode(bytes, type) ⇒ Object
- .decode_bool(bytes) ⇒ Object
- .decode_bytes(bytes) ⇒ Object
- .decode_double(bytes) ⇒ Object
- .decode_float(bytes) ⇒ Object
- .decode_string(bytes) ⇒ Object
- .decode_varint(bytes) ⇒ Object (also: decode_uint32, decode_uint64)
- .decode_varint_pos(bytes) ⇒ Object
- .decode_zigzaged_varint(bytes) ⇒ Object (also: decode_sint32, decode_sint64)
Class Method Details
.decode(bytes, type) ⇒ Object
8 9 10 11 12 |
# 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) ⇒ Object
49 50 51 |
# File 'lib/krpc/protobuf_utils.rb', line 49 def decode_bool(bytes) decode_varint(bytes) != 0 end |
.decode_bytes(bytes) ⇒ Object
56 57 58 59 |
# 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) ⇒ Object
46 47 48 |
# File 'lib/krpc/protobuf_utils.rb', line 46 def decode_double(bytes) bytes.unpack('E').first end |
.decode_float(bytes) ⇒ Object
43 44 45 |
# File 'lib/krpc/protobuf_utils.rb', line 43 def decode_float(bytes) bytes.unpack('e').first end |
.decode_string(bytes) ⇒ Object
52 53 54 55 |
# 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) ⇒ Object Also known as: decode_uint32, decode_uint64
15 16 17 |
# File 'lib/krpc/protobuf_utils.rb', line 15 def decode_varint(bytes) decode_varint_pos(bytes)[0] end |
.decode_varint_pos(bytes) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
# 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) ⇒ Object Also known as: decode_sint32, decode_sint64
32 33 34 35 |
# File 'lib/krpc/protobuf_utils.rb', line 32 def decode_zigzaged_varint(bytes) zigzaged = decode_varint(bytes) (zigzaged >> 1) ^ -(zigzaged & 1) end |