1

我正在编写一个 Python 2.7 程序,它通过套接字连接发送和接收数据包,与基于 TCP/IP 的第 3 方 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-lzo1.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以错误的方式使用了包,或者数据一开始就被不正确地压缩了。

4

1 回答 1

0

通过反复试验,我发现我需要将压缩字符串的长度传递给解压缩函数以使其工作。它是这样工作的:

lzo.decompress(body,False,176)
于 2017-10-28T11:11:37.693 回答