@@ -67,6 +67,15 @@ def _method(func, instance):
6767 else :
6868 return types .MethodType (func , instance , type (instance ))
6969
70+ def _to_ord (ch ):
71+ """Get char code in a cross-Python way"""
72+ if isinstance (ch , int ):
73+ # Python 3: bytes char is already an integer, no need to call ord()
74+ return ch
75+ else :
76+ # Python 2: string char required to call ord()
77+ return ord (ch )
78+
7079
7180class Field (object ):
7281 """Field objects represent the data fields of a Struct.
@@ -387,23 +396,24 @@ def __init__(self, name, pad = 1):
387396 self .pad = pad
388397
389398 def pack_value (self , val ):
390- slen = len (val )
399+ val_bytes = val .encode ()
400+ slen = len (val_bytes )
391401
392402 if self .pad :
393- return val + b'\0 ' * ((4 - slen % 4 ) % 4 ), slen , None
403+ return val_bytes + b'\0 ' * ((4 - slen % 4 ) % 4 ), slen , None
394404 else :
395- return val , slen , None
405+ return val_bytes , slen , None
396406
397407 def parse_binary_value (self , data , display , length , format ):
398408 if length is None :
399- return str ( data ), ''
409+ return data . decode ( ), b ''
400410
401411 if self .pad :
402412 slen = length + ((4 - length % 4 ) % 4 )
403413 else :
404414 slen = length
405415
406- return str ( data [:length ]), data [slen :]
416+ return data [:length ]. decode ( ), data [slen :]
407417
408418
409419class String16 (ValueField ):
@@ -621,11 +631,11 @@ def parse_binary_value(self, data, display, length, format):
621631 data = data [length + ((4 - length % 4 ) % 4 ):]
622632
623633 elif format == 16 :
624- ret = (16 , array (array_unsigned_codes [2 ], str ( data [:2 * length ]).encode ()))
634+ ret = (16 , array (array_unsigned_codes [2 ], data [:2 * length ]. decode ( ).encode ()))
625635 data = data [2 * (length + length % 2 ):]
626636
627637 elif format == 32 :
628- ret = (32 , array (array_unsigned_codes [4 ], str ( data [:4 * length ]).encode ()))
638+ ret = (32 , array (array_unsigned_codes [4 ], data [:4 * length ]. decode ( ).encode ()))
629639 data = data [4 * length :]
630640
631641 return ret , data
@@ -780,7 +790,7 @@ class ModifierMapping(ValueField):
780790 structcode = None
781791
782792 def parse_binary_value (self , data , display , length , format ):
783- a = array (array_unsigned_codes [1 ], str ( data [:8 * format ]) )
793+ a = array (array_unsigned_codes [1 ], data [:8 * format ])
784794
785795 ret = []
786796 for i in range (0 , 8 ):
@@ -818,10 +828,10 @@ def pack_value(self, value):
818828 def parse_binary_value (self , data , display , length , format ):
819829 from . import event
820830
821- estruct = display .event_classes .get (ord (data [0 ]) & 0x7f , event .AnyEvent )
831+ estruct = display .event_classes .get (_to_ord (data [0 ]) & 0x7f , event .AnyEvent )
822832 if type (estruct ) == dict :
823833 # this etype refers to a set of sub-events with individual subcodes
824- estruct = estruct [ord (data [1 ])]
834+ estruct = estruct [_to_ord (data [1 ])]
825835
826836 return estruct (display = display , binarydata = data [:32 ]), data [32 :]
827837
@@ -869,7 +879,7 @@ def pack_value(self, val):
869879 return chr (len (val )) + val
870880
871881 def parse_binary (self , data , display ):
872- slen = ord (data [0 ]) + 1
882+ slen = _to_ord (data [0 ]) + 1
873883 return data [1 :slen ], data [slen :]
874884
875885Str = StrClass ()
@@ -1222,12 +1232,12 @@ def parse_binary_value(self, data, display, length, format):
12221232 break
12231233
12241234 # font change
1225- if ord (data [0 ]) == 255 :
1226- values .append (struct .unpack ('>L' , str ( data [1 :5 ]).encode ())[0 ])
1235+ if _to_ord (data [0 ]) == 255 :
1236+ values .append (struct .unpack ('>L' , data [1 :5 ]. decode ( ).encode ())[0 ])
12271237 data = data [5 :]
12281238
12291239 # skip null strings
1230- elif ord (data [0 ]) == 0 and ord (data [1 ]) == 0 :
1240+ elif _to_ord (data [0 ]) == 0 and _to_ord (data [1 ]) == 0 :
12311241 data = data [2 :]
12321242
12331243 # string with delta
0 commit comments