簡體   English   中英

如何在 Python 中對字節數組進行 gzip 壓縮?

[英]How to gzip a bytearray in Python?

我在 bytearray 中有二進制數據,我想先對其進行 gzip,然后通過請求發布。 我發現了如何 gzip 文件,但找不到字節數組。 那么,如何通過 Python 壓縮字節數組?

看看 Python 的zlib模塊。

Python 3: zlib -module

一個簡短的例子:

import zlib
compressed_data = zlib.compress(my_bytearray)

您可以通過以下方式再次解壓縮數據:

decompressed_byte_data = zlib.decompress(compressed_data)

Python 2:zlib -module

一個簡短的例子:

import zlib
compressed_data = zlib.compress(my_string)

您可以通過以下方式再次解壓縮數據:

decompressed_string = zlib.decompress(compressed_data)

如您所見,Python 3 使用字節數組,而 Python 2 使用字符串。

如果 bytearray 不是太大而不能多次存儲在內存中並稱為b ,您可以:

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

如果您需要先進行解碼,請查看 bytearray 的decode()方法。

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() 。

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 下工作相同 -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM