如何在Python中对字节数组进行gzip压缩?
我有一些二进制数据,存放在一个字节数组里。我想先把这些数据进行gzip压缩,然后通过请求发送出去。我找到了如何对文件进行gzip压缩的方法,但不知道怎么对字节数组进行压缩。那么,怎么用Python对字节数组进行gzip压缩呢?
4 个回答
1
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需要访问字节数组的内容,可以使用buffer()来实现这一点。
1
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下也是一样的效果 -
1
如果这个字节数组(bytearray)不大到无法在内存中存储多次,并且我们把它叫做 b
,那么你可以直接这样做:
b_gz = str(b).encode('zlib')
如果你需要先进行解码,可以看看字节数组的 decode()
方法。
18
看看Python的zlib
模块吧。
Python 3: zlib
模块
这里有个简单的例子:
import zlib
compressed_data = zlib.compress(my_bytearray)
你可以通过以下方式再次解压数据:
decompressed_byte_data = zlib.decompress(compressed_data)
Python 2: zlib
模块
这里也有个简单的例子:
import zlib
compressed_data = zlib.compress(my_string)
你可以通过以下方式再次解压数据:
decompressed_string = zlib.decompress(compressed_data)
可以看到,Python 3使用的是字节数组,而Python 2使用的是字符串。