@@ -41,22 +41,30 @@ def _decode_bytes(self, size, offset):
4141 new_offset = offset + size
4242 return self ._buffer [offset :new_offset ], new_offset
4343
44- # pylint: disable=no-self-argument
45- # |-> I am open to better ways of doing this as long as it doesn't involve
46- # lots of code duplication.
47- def _decode_packed_type (type_code , type_size , pad = False ):
48- # pylint: disable=protected-access, missing-docstring
49- def unpack_type (self , size , offset ):
50- if not pad :
51- self ._verify_size (size , type_size )
52- new_offset = offset + size
53- packed_bytes = self ._buffer [offset :new_offset ]
54- if pad :
55- packed_bytes = packed_bytes .rjust (type_size , b'\x00 ' )
56- (value , ) = struct .unpack (type_code , packed_bytes )
57- return value , new_offset
58-
59- return unpack_type
44+ def _decode_double (self , size , offset ):
45+ self ._verify_size (size , 8 )
46+ new_offset = offset + size
47+ packed_bytes = self ._buffer [offset :new_offset ]
48+ (value , ) = struct .unpack (b'!d' , packed_bytes )
49+ return value , new_offset
50+
51+ def _decode_float (self , size , offset ):
52+ self ._verify_size (size , 4 )
53+ new_offset = offset + size
54+ packed_bytes = self ._buffer [offset :new_offset ]
55+ (value , ) = struct .unpack (b'!f' , packed_bytes )
56+ return value , new_offset
57+
58+ def _decode_int32 (self , size , offset ):
59+ if size == 0 :
60+ return 0 , offset
61+ new_offset = offset + size
62+ packed_bytes = self ._buffer [offset :new_offset ]
63+
64+ if size != 4 :
65+ packed_bytes = packed_bytes .rjust (4 , b'\x00 ' )
66+ (value , ) = struct .unpack (b'!i' , packed_bytes )
67+ return value , new_offset
6068
6169 def _decode_map (self , size , offset ):
6270 container = {}
@@ -99,17 +107,17 @@ def _decode_utf8_string(self, size, offset):
99107 _type_decoder = {
100108 1 : _decode_pointer ,
101109 2 : _decode_utf8_string ,
102- 3 : _decode_packed_type ( b'!d' , 8 ), # double ,
110+ 3 : _decode_double ,
103111 4 : _decode_bytes ,
104112 5 : _decode_uint , # uint16
105113 6 : _decode_uint , # uint32
106114 7 : _decode_map ,
107- 8 : _decode_packed_type ( b'!i' , 4 , pad = True ), # int32
115+ 8 : _decode_int32 ,
108116 9 : _decode_uint , # uint64
109117 10 : _decode_uint , # uint128
110118 11 : _decode_array ,
111119 14 : _decode_boolean ,
112- 15 : _decode_packed_type ( b'!f' , 4 ), # float ,
120+ 15 : _decode_float ,
113121 }
114122
115123 def decode (self , offset ):
0 commit comments