2014-11-05 111 views
0

我有一個字節陣列裏面的二進制數據,我想先壓縮然後通過請求發佈。我發現如何gzip一個文件,但無法找到一個字節陣列。那麼,我該如何通過Python對一個bytearray進行gzip?如何在Python中gzip一個bytearray?

+0

醜陋的方式:將其保存在文件中:P。但也許這將有助於:http://stackoverflow.com/questions/8506897/how-do-i-gzip-compress-a-string-in-python – 2014-11-05 09:14:09

回答

0

萬一字節組不是太大存儲在內存中多次並稱爲b,你可以:

b_gz = str(b).encode('zlib') 

如果你需要做的第一deocding,看看在decode() bytearray的方法。

+1

我不知道這是否正確?如果你在一個字節數組中調用'str()',你會得到像''bytearray(b'test')''這樣的東西 - 但是他想要壓縮字節數組而不是一些描述字節數組的字符串(我認爲這也可能導致在某些特殊情況下丟失數據?)。 – mozzbozz 2014-11-05 09:29:42

+0

我只看到代碼只能在Python 2中工作。在Python 3中,該領域已經發生了一些變化。 – 2014-11-05 09:43:55

+1

好的,這就是我想的(我主要使用Python 3)。你可以在你的帖子中留言,以便沒有閱讀「第一次嘗試」的評論。 – mozzbozz 2014-11-05 12:34:06

1

看一看Python的模塊zlib

的Python 3:zlib-module

簡單例子:

decompressed_byte_data = zlib.decompress(compressed_data) 

的Python 2:

import zlib 
compressed_data = zlib.compress(my_bytearray) 

可以再次通過解壓縮數據zlib-module

簡單例子:

import zlib 
compressed_data = zlib.compress(my_string) 

您可以通過重新解壓縮數據:

decompressed_string = zlib.decompress(compressed_data) 

正如你所看到的,Python 3中使用的ByteArray而Python 2使用的字符串。

+1

對我來說,它需要一個字符串,而不是bytearray。 'compressedData = zlib.compress(mystring)' – mgear 2016-05-27 03:24:54

+1

@mgear這是因爲您使用的Python 2需要輸入字符串 - 在Python 3中,函數需要一個字節數組。 ..我已經添加到我的答案。 – mozzbozz 2016-06-05 13:53:47

0

Python標準庫的zlib的模塊應該滿足您的要求:

>>> import zlib 
>>> a = b'abcdefghijklmn' * 10 
>>> ca = zlib.compress(a) 
>>> len(a) 
140 
>>> len(ca) 
25 
>>> b = zlib.decompress(ca) 
>>> b == a 
True 
>>> b 
b'abcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmnabcdefghijklmn' 

這是Python3.4下的輸出,但它的Python 2.7下工作一樣 -

0
import zlib 
    import binascii 


def compress_packet(packet): 
    return zlib.compress(buffer(packet),1) 

def decompress_packet(compressed_packet): 
    return zlib.decompress(compressed_packet) 

    def demo_zlib() : 

     packet1 = bytearray() 
     packet1.append(0x41) 
     packet1.append(0x42) 
     packet1.append(0x43) 
     packet1.append(0x44) 

     print "before compression: packet:{0}".format(binascii.hexlify(packet1)) 
     cpacket1 = compress_packet(packet1) 
     print "after compression: packet:{0}".format(binascii.hexlify(cpacket1)) 

     print "before decompression: packet:{0}".format(binascii.hexlify(cpacket1)) 
     dpacket1 = decompress_packet(buffer(cpacket1)) 
     print "after decompression: packet:{0}".format(binascii.hexlify(dpacket1)) 




    def main() : 
     demo_zlib() 

    if __name__ == '__main__' : 
     main() 

這應該做。 zlib需要訪問bytearray內容,爲此使用buffer()。