30 lines
889 B
Python
30 lines
889 B
Python
|
from struct import pack, unpack, calcsize
|
||
|
|
||
|
|
||
|
def message(tp, *values):
|
||
|
strtype = type('')
|
||
|
typecodes = ['']
|
||
|
for v in values:
|
||
|
if type(v) is strtype:
|
||
|
typecodes.append('%ds' % len(v))
|
||
|
elif 0 <= v < 256:
|
||
|
typecodes.append('B')
|
||
|
else:
|
||
|
typecodes.append('l')
|
||
|
typecodes = ''.join(typecodes)
|
||
|
assert len(typecodes) < 256
|
||
|
return pack(("!B%dsc" % len(typecodes)) + typecodes,
|
||
|
len(typecodes), typecodes, tp, *values)
|
||
|
|
||
|
def decodemessage(data):
|
||
|
if data:
|
||
|
limit = ord(data[0]) + 1
|
||
|
if len(data) >= limit:
|
||
|
typecodes = "!c" + data[1:limit]
|
||
|
end = limit + calcsize(typecodes)
|
||
|
if len(data) >= end:
|
||
|
return unpack(typecodes, data[limit:end]), data[end:]
|
||
|
#elif end > 1000000:
|
||
|
# raise OverflowError
|
||
|
return None, data
|