如何在Python中压缩字节数组?

问题描述 投票:3回答:4

我在一个字节数组中有二进制数据,我想先gzip,然后通过请求发布。我发现了如何gzip文件,但找不到字节数组。因此,如何通过Python gzip一个字节数组?

python bytearray gzip python-requests
4个回答
6
投票

看看Python的zlib-模块。

Python 3: zlib-module

一个简短的例子:

zlib

您可以通过以下方式再次解压缩数据:

import zlib
compressed_data = zlib.compress(my_bytearray)

Python 2: decompressed_byte_data = zlib.decompress(compressed_data)

一个简短的例子:

zlib-module

您可以通过以下方式再次解压缩数据:

zlib

您可以看到,Python 3使用字节数组,而Python 2使用字符串。


1
投票
import zlib
compressed_data = zlib.compress(my_string)

这应该做。 zlib需要访问字节数组内容,为此使用buffer()。


0
投票

如果字节数组不是太大而不能多次存储在内存中并且被称为decompressed_string = zlib.decompress(compressed_data) ,则可以:

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

如果您需要先进行deoc,请查看字节数组的b方法。


0
投票

Python标准库的zlib模块应满足您的要求:

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

这是Python3.4的输出,但在Python 2.7下的工作原理相同-

© www.soinside.com 2019 - 2024. All rights reserved.