1111 f32_b_t ,
1212 f64_b_t ,
1313)
14+ from ._ext import ExtType
1415
1516# deference for performance
1617
4950f64_b_unpack = f64_b_t .unpack
5051
5152_B = tuple ([bytes ([i ]) for i in range (256 )])
53+ _PO2 = {1 : b"\xd4 " , 2 : b"\xd5 " , 4 : b"\xd6 " , 8 : b"\xd7 " , 16 : b"\xd8 " }
5254
5355
5456def pack_stream (stream , obj ):
@@ -137,6 +139,21 @@ def pack_stream(stream, obj):
137139 else :
138140 raise ValueError ("bin too large" , obj )
139141 stream .write (obj )
142+ elif _type is ExtType :
143+ data = obj .data
144+ p_code = s8_b_pack (obj .code )
145+ extl = len (data )
146+ if extl <= 16 and extl in _PO2 : # fixext (0xD4 - 0xD8)
147+ stream .write (_PO2 [extl ] + p_code )
148+ elif extl <= 0xFF : # ext8
149+ stream .write (b"\xc7 " + _B [extl ] + p_code )
150+ elif extl <= 0xFF_FF : # ext16
151+ stream .write (b"\xc8 " + u16_b_pack (extl ) + p_code )
152+ elif extl <= 0xFF_FF_FF_FF : # ext32
153+ stream .write (b"\xc9 " + u32_b_pack (extl ) + p_code )
154+ else :
155+ raise ValueError ("ext too large" , obj )
156+ stream .write (data )
140157 else :
141158 raise TypeError ("type not supported:" , obj , _type )
142159
@@ -172,8 +189,14 @@ def unpack_stream(stream):
172189 elif first_byte == 0xC6 :
173190 bl = u32_b_unpack (stream )
174191 obj = stream .read (bl )
175- elif 0xC7 <= first_byte <= 0xC9 :
176- raise NotImplementedError
192+ elif first_byte <= 0xC9 : # ext (0xC7 - 0xC9)
193+ if first_byte == 0xC7 : # ext8
194+ extl = u8_b_unpack (stream )
195+ elif first_byte == 0xC8 : # ext16
196+ extl = u16_b_unpack (stream )
197+ else : # ext32
198+ extl = u32_b_unpack (stream )
199+ obj = ExtType (s8_b_unpack (stream ), stream .read (extl ))
177200 elif first_byte == 0xCA :
178201 obj = f32_b_unpack (stream )
179202 elif first_byte == 0xCB :
@@ -194,8 +217,8 @@ def unpack_stream(stream):
194217 obj = s32_b_unpack (stream )
195218 elif first_byte == 0xD3 :
196219 obj = s64_b_unpack (stream )
197- elif 0xD4 <= first_byte <= 0xD8 :
198- raise NotImplementedError
220+ elif first_byte <= 0xD8 : # fixext (0xD4 - 0xD8)
221+ obj = ExtType ( s8_b_unpack ( stream ), stream . read ( 1 << ( first_byte - 0xD4 )))
199222 elif first_byte == 0xD9 :
200223 sl = u8_b_unpack (stream )
201224 obj = stream .read (sl ).decode ("utf-8" )
0 commit comments