import struct
string = b'-'
fmt=">h%ds" % len(string)
Здесь вы упаковываете длину и строку:
t = struct.pack(fmt, len(string), string)
print(repr(t))
# '\x00\x01-'
Таким образом, при распаковке вы должны получить два значения обратно, то есть длину и строку:
length,string2=struct.unpack(fmt,t)
print(repr(string2))
# '-'
В общем, если вы не знаете, как была упакована строка, то нет надежного способа восстановить данные. Вам просто нужно угадать!
Если вы знаете данные
состоит из длины строки, а затем сама строка, то вы
можно попробовать методом проб и ошибок:
import struct
string = b'-'
fmt=">h%ds" % len(string)
t = struct.pack(fmt, len(string), string)
print(repr(t))
for endian in ('>','<'):
for fmt,size in (('b',1),('B',1),('h',2),('H',2),('i',4),('I',4),
('l',4),('L',4),('q',8),('Q',8)):
fmt=endian+fmt
try:
length,=struct.unpack(fmt,t[:size])
except struct.error:
pass
else:
fmt=fmt+'{0}s'.format(length)
try:
length,string2=struct.unpack(fmt,t)
except struct.error:
pass
else:
print(fmt,length,string2)
# ('>h1s', 1, '-')
# ('>H1s', 1, '-')
Возможно, можно составить неоднозначную строку t
, которая имеет несколько допустимых распаковок, что приведет к различным string2
с. Я не уверен.