397
397
UNPACKED_MARKERS .update ({bytes (bytearray ([z + 256 ])): z for z in range (MINUS_2_TO_THE_4 , 0 )})
398
398
399
399
400
+ EndOfStream = object ()
401
+
402
+
400
403
class Structure (list ):
401
404
402
405
def __init__ (self , capacity , signature ):
@@ -614,7 +617,10 @@ def __init__(self):
614
617
self .pos = 0
615
618
616
619
def load (self , buffer ):
617
- self .buffer = buffer
620
+ if isinstance (buffer , bytearray ):
621
+ self .buffer = buffer
622
+ else :
623
+ self .buffer = bytearray (buffer )
618
624
self .pos = 0
619
625
620
626
def read (self , n = 1 ):
@@ -624,7 +630,10 @@ def read(self, n=1):
624
630
self .pos += n
625
631
else :
626
632
self .pos = len (self .buffer )
627
- return bytes (self .buffer [start :self .pos ])
633
+ return self .buffer [start :self .pos ]
634
+
635
+ def read_bytes (self , n = 1 ):
636
+ return bytes (self .read (n ))
628
637
629
638
def read_marker (self ):
630
639
if self .pos < len (self .buffer ):
@@ -635,7 +644,6 @@ def read_marker(self):
635
644
return - 1
636
645
637
646
def unpack (self ):
638
- stream_read = self .read
639
647
marker = self .read_marker ()
640
648
641
649
if marker == - 1 :
@@ -653,7 +661,7 @@ def unpack(self):
653
661
654
662
# Float
655
663
elif marker == 0xC1 :
656
- return struct_unpack (DOUBLE_STRUCT , stream_read (8 ))[0 ]
664
+ return struct_unpack (DOUBLE_STRUCT , self . read (8 ))[0 ]
657
665
658
666
# Boolean
659
667
elif marker == 0xC2 :
@@ -663,61 +671,61 @@ def unpack(self):
663
671
664
672
# Integer
665
673
elif marker == 0xC8 :
666
- return UNPACKED_INT_8 [stream_read (1 )]
674
+ return UNPACKED_INT_8 [self . read_bytes (1 )]
667
675
elif marker == 0xC9 :
668
- return UNPACKED_INT_16 [stream_read (2 )]
676
+ return UNPACKED_INT_16 [self . read_bytes (2 )]
669
677
elif marker == 0xCA :
670
- return struct_unpack (INT_32_STRUCT , stream_read (4 ))[0 ]
678
+ return struct_unpack (INT_32_STRUCT , self . read (4 ))[0 ]
671
679
elif marker == 0xCB :
672
- return struct_unpack (INT_64_STRUCT , stream_read (8 ))[0 ]
680
+ return struct_unpack (INT_64_STRUCT , self . read (8 ))[0 ]
673
681
674
682
# Bytes
675
683
elif marker == 0xCC :
676
- byte_size = UNPACKED_UINT_8 [stream_read (1 )]
677
- return stream_read (byte_size )
684
+ byte_size = UNPACKED_UINT_8 [self . read_bytes (1 )]
685
+ return self . read (byte_size )
678
686
elif marker == 0xCD :
679
- byte_size = UNPACKED_UINT_16 [stream_read (2 )]
680
- return stream_read (byte_size )
687
+ byte_size = UNPACKED_UINT_16 [self . read_bytes (2 )]
688
+ return self . read (byte_size )
681
689
elif marker == 0xCE :
682
- byte_size = struct_unpack (UINT_32_STRUCT , stream_read (4 ))[0 ]
683
- return stream_read (byte_size )
690
+ byte_size = struct_unpack (UINT_32_STRUCT , self . read (4 ))[0 ]
691
+ return self . read (byte_size )
684
692
685
693
else :
686
694
marker_high = marker & 0xF0
687
695
unpack = self .unpack
688
696
689
697
# String
690
698
if marker_high == 0x80 : # TINY_STRING
691
- return stream_read (marker & 0x0F ).decode (ENCODING )
699
+ return self . read (marker & 0x0F ).decode (ENCODING )
692
700
elif marker == 0xD0 : # STRING_8:
693
- byte_size = UNPACKED_UINT_8 [stream_read (1 )]
694
- return stream_read (byte_size ).decode (ENCODING )
701
+ byte_size = UNPACKED_UINT_8 [self . read_bytes (1 )]
702
+ return self . read (byte_size ).decode (ENCODING )
695
703
elif marker == 0xD1 : # STRING_16:
696
- byte_size = UNPACKED_UINT_16 [stream_read (2 )]
697
- return stream_read (byte_size ).decode (ENCODING )
704
+ byte_size = UNPACKED_UINT_16 [self . read_bytes (2 )]
705
+ return self . read (byte_size ).decode (ENCODING )
698
706
elif marker == 0xD2 : # STRING_32:
699
- byte_size = struct_unpack (UINT_32_STRUCT , stream_read (4 ))[0 ]
700
- return stream_read (byte_size ).decode (ENCODING )
707
+ byte_size = struct_unpack (UINT_32_STRUCT , self . read (4 ))[0 ]
708
+ return self . read (byte_size ).decode (ENCODING )
701
709
702
710
# List
703
711
elif marker_high == 0x90 :
704
712
size = marker & 0x0F
705
713
return [unpack () for _ in range (size )]
706
714
elif marker == 0xD4 : # LIST_8:
707
- size = UNPACKED_UINT_8 [stream_read (1 )]
715
+ size = UNPACKED_UINT_8 [self . read_bytes (1 )]
708
716
return [unpack () for _ in range (size )]
709
717
elif marker == 0xD5 : # LIST_16:
710
- size = UNPACKED_UINT_16 [stream_read (2 )]
718
+ size = UNPACKED_UINT_16 [self . read_bytes (2 )]
711
719
return [unpack () for _ in range (size )]
712
720
elif marker == 0xD6 : # LIST_32:
713
- size = struct_unpack (UINT_32_STRUCT , stream_read (4 ))[0 ]
721
+ size = struct_unpack (UINT_32_STRUCT , self . read (4 ))[0 ]
714
722
return [unpack () for _ in range (size )]
715
723
elif marker == 0xD7 : # LIST_STREAM:
716
724
value = []
717
725
item = None
718
- while item != END_OF_STREAM :
726
+ while item is not EndOfStream :
719
727
item = unpack ()
720
- if item != END_OF_STREAM :
728
+ if item is not EndOfStream :
721
729
value .append (item )
722
730
return value
723
731
@@ -730,21 +738,21 @@ def unpack(self):
730
738
value [key ] = unpack ()
731
739
return value
732
740
elif marker == 0xD8 : # MAP_8:
733
- size = UNPACKED_UINT_8 [stream_read (1 )]
741
+ size = UNPACKED_UINT_8 [self . read_bytes (1 )]
734
742
value = {}
735
743
for _ in range (size ):
736
744
key = unpack ()
737
745
value [key ] = unpack ()
738
746
return value
739
747
elif marker == 0xD9 : # MAP_16:
740
- size = UNPACKED_UINT_16 [stream_read (2 )]
748
+ size = UNPACKED_UINT_16 [self . read_bytes (2 )]
741
749
value = {}
742
750
for _ in range (size ):
743
751
key = unpack ()
744
752
value [key ] = unpack ()
745
753
return value
746
754
elif marker == 0xDA : # MAP_32:
747
- size = struct_unpack (UINT_32_STRUCT , stream_read (4 ))[0 ]
755
+ size = struct_unpack (UINT_32_STRUCT , self . read (4 ))[0 ]
748
756
value = {}
749
757
for _ in range (size ):
750
758
key = unpack ()
@@ -753,34 +761,34 @@ def unpack(self):
753
761
elif marker == 0xDB : # MAP_STREAM:
754
762
value = {}
755
763
key = None
756
- while key != END_OF_STREAM :
764
+ while key is not EndOfStream :
757
765
key = unpack ()
758
- if key != END_OF_STREAM :
766
+ if key is not EndOfStream :
759
767
value [key ] = unpack ()
760
768
return value
761
769
762
770
# Structure
763
771
elif marker_high == 0xB0 :
764
- signature = stream_read (1 )
772
+ signature = self . read_bytes (1 )
765
773
value = Structure (marker & 0x0F , signature )
766
774
for _ in range (value .capacity ):
767
775
value .append (unpack ())
768
776
return value
769
777
elif marker == 0xDC : #STRUCT_8:
770
- size , signature = stream_read (2 )
778
+ size , signature = self . read_bytes (2 )
771
779
value = Structure (UNPACKED_UINT_8 [size ], signature )
772
780
for _ in range (value .capacity ):
773
781
value .append (unpack ())
774
782
return value
775
783
elif marker == 0xDD : #STRUCT_16:
776
- data = stream_read (3 )
784
+ data = self . read_bytes (3 )
777
785
value = Structure (UNPACKED_UINT_16 [data [0 :2 ]], data [2 ])
778
786
for _ in range (value .capacity ):
779
787
value .append (unpack ())
780
788
return value
781
789
782
790
elif marker == 0xDF : #END_OF_STREAM:
783
- return END_OF_STREAM
791
+ return EndOfStream
784
792
785
793
else :
786
794
raise RuntimeError ("Unknown PackStream marker %02X" % marker )
@@ -795,13 +803,13 @@ def unpack_structure_header(self):
795
803
def _unpack_structure_header (self , marker ):
796
804
marker_high = marker & 0xF0
797
805
if marker_high == 0xB0 : # TINY_STRUCT
798
- signature = self .read (1 )
806
+ signature = self .read_bytes (1 )
799
807
return marker & 0x0F , signature
800
808
elif marker == 0xDC : # STRUCT_8:
801
- size , signature = self .read (2 )
809
+ size , signature = self .read_bytes (2 )
802
810
return UNPACKED_UINT_8 [size ], signature
803
811
elif marker == 0xDD : # STRUCT_16:
804
- data = self .read (3 )
812
+ data = self .read_bytes (3 )
805
813
return UNPACKED_UINT_16 [data [0 :2 ]], data [2 ]
806
814
else :
807
815
raise RuntimeError ("Expected structure, found marker %02X" % marker )
0 commit comments