使用Python 2.7 / python-lzo 1.11

时间:2017-10-28 05:14:57

标签: python sockets compression lzo

我正在编写一个Python 2.7程序,它通过套接字连接发送和接收数据包,与第三方基于TCP / IP的API进行交互。

数据包由以下部分组成:

  • 在数据前面插入一个10字节长的标题;
  • 体;
  • 必须将预告片附加到数据的末尾。

标题包含有关数据长度和数据类型的信息。整个数据包包括标题,实际数据和预告片。

压缩方法是MiniLZO。

我的问题是如何处理数据 - 特别是数据包的主体,它是用MiniLZO压缩的。

例如,当我发送这样的请求时:

bytearray(b'\x01W\x00\x00\x000W\x00\x00\x00')
<TASK><MESSAGE Type="LogonReq" Session="" Reference="TP1" Product="2">
</MESSAGE></TASK>
bytearray(b'\x02')

服务器回复:

HEADER: 10 Bytes 

'\x01\xb1\x00\x00\x001\xae\x00\x00\x00'

BODY:177 Bytes 

'\x002<TASKREPLY><MESSAGE Type="LogonReqReply" Session="DUH3PRdH" 
ReferencP\x05\x00\x18TP1" Product="2">\r\n<ANSWER Result="1" 
Time@\x01\x00\x1225146" Date="20171028" Mode="P" /></\xcc\x11\x0c>
</TASKREPLY>\r\n\x11\x00\x00'

TRAILER:1 Bytes 

 '\x02'

我安装了包python-lzo 1.11并试图通过以下方式解压缩身体:

>>> import lzo
>>> lzo.decompress(body)

但它会返回此错误:

Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    lzo.decompress(body)
error: Header error - invalid compressed data

我不知道如何解决这个问题。我试图谷歌它,但似乎没有关于Python / MiniLZO的信息。我不确定我是否以错误的方式使用了lzo包,或者数据首先被压缩得不正确。

1 个答案:

答案 0 :(得分:0)

通过反复试验我发现我需要将压缩字符串的长度传递给解压缩函数才能使其正常工作。它的工作原理如下:

lzo.decompress(body,False,176)