2016-12-29 11 views
2

Я использую следующие строки в моем коде:Распаковка сжатых ZLib строки с Byte нарезка

payloadByte = zlib.compress(str.encode("hello")) 
print(zlib.decompress(payloadByte[0:4])) 

Однако Zlib проливает следующее сообщение об ошибке:

zlib.error: Error -5 while decompressing data: incomplete or truncated stream 

Мне нужно использовать методы байт нарезки из-за того, что я должен распаковываться из определенной точки в большом массиве байтов. Я создал этот байтовый массив, используя-структуру, например, так:

messageIdByte = struct.pack("i", int(messageId)) 
payloadByte = zlib.compress(str.encode("hello")) 
return messageIdByte + payloadByte 

В этом примере я уже распаковал-структуру, как так:

messageId = struct.unpack("i", bytes[0:4])[0] 

Теперь мне нужно распаковать строку из байтовый массив, но получение конкретных байтов [4: 8] дает эту ошибку.

+0

Не могли бы вы пояснить, зачем вам это нужно? В примере, который вы приводите, проблема заключается не в том, что вы декомпрессируете срез массива, а в том, что вы декомпрессируете то, что не является допустимым, сжатым фрагментом данных zlib. – Irisshpunk

+0

Я обновил свой вопрос, чтобы надеяться, отразить то, что я хочу, чтобы код делал. – Rob

+0

Возможно, это будет то, что вы ищете: http://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib? – Dekel

ответ

1

Возможно, проблема заключается в том, что данные, которые вы пытаетесь распаковать, не соответствуют вашим размерам. Например, в вашем примере, когда вы сжимаете строку «привет» с помощью zlib, результат равен 13 байтам, но ваш код предполагает, что итоговая сжатая строка составляет 5 байтов. Попробуйте что-то вроде этого:

x = len(payloadByte) 
# elsewhere in the code where decompression happens 
zlib.decompress(bytes[4:(4+x)]) 

, чтобы убедиться, что вы извлекаете весь фрагмент сжатых данных.

+0

Ты совершенно прав. В моем коде I_was_ передал длину, но это была длина строки, а не длина сжатой строки zlib. благодаря – Rob

 Смежные вопросы

  • Нет связанных вопросов^_^