2016-12-29 72 views
2

我用我下面幾行代碼:解壓壓縮zlib的字符串字節切片

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壓縮字符串「hello」時,結果爲13個字節長,但您的代碼假定產生的壓縮字符串爲5個字節。嘗試這樣的:

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

確保您檢索整個壓縮數據塊。

+0

你完全正確。在我的代碼中,我_was_傳遞了長度,但它是字符串的長度,而不是zlib壓縮字符串的長度。謝謝 – Rob