Python从tcp解包二进制流

2024-10-01 15:44:00 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,所以我觉得熟悉Python是个好主意。(我有过Java、php、perl、VB等方面的经验,不是什么大师,而是中级知识)

因此,我试图编写一个脚本,从套接字获取数据,并将其转换为屏幕。大致开始代码如下:

我的代码似乎正确地从套接字中读取二进制信息,但我无法解包,因为我无法访问原始结构。在

我用一个不同的程序得到了这个流的输出(它写得很糟糕,所以我要处理这个问题)

当我打印出录像时,就像这样。。。在

b'L\x00k\x07vQ\n\x01\xffh\x00\x04NGIN\x04MAIN6Product XX finished reprocessing cdc XXXXX at jesadr 0c\x00k\x07vQ\n\x01\xffF\x00\x06CSSPRD\x0cliab_checkerCCheckpointed to XXXXXXXXXXXXXXXX:XXXXXXX.XXX at jesadr 0 (serial 0)[\x00l\x07vQ\n\x00\xff\x01\x00\x05MLIFE\x06dayendBdayend 1 Copyright XXXX XXXXXXX XXXXXXX XXXXX XXX XXXXXX XXXXXXXX.

通过观察这个,并将它与另一个程序的输出进行比较,我推测它应该被分解成。。在

^{pr2}$

有相应的信息

04-23
00:00:43
10
1
NGIN
MAIN
255
104
Product XX finished reprocessing cdc XXXXX at jesadr 0

现在,根据我的研究,我似乎需要使用“struct”并对其进行解包,但是我不知道它的原始结构,我只知道从中可以得到什么信息,老实说,我花了很长时间来弄清楚这个问题。在

我曾使用python解释器尝试解包代码行的一些部分,但是这是一个令人沮丧的练习。在

如果有人能帮我开始,我会非常感激的。在

谢谢


Tags: 代码程序信息结构atfinishedxxxxxxx
3条回答

好吧。我想我已经把它解码了,虽然我不确定中间的16位值。在

这段python2.7代码。。。在

from cStringIO import StringIO
import struct
import time

def decode(f):

    def read_le16(f):
        return struct.unpack('<h', f.read(2))[0]

    def read_timestamp(f):
        ts = struct.unpack('<l', f.read(4))[0]
        return time.ctime(ts)

    def read_byte(f):
        return ord(f.read(1))

    def read_pascal(f):
        l = ord(f.read(1))
        return f.read(l)

    result = []

    # Read total length
    result.append('Total message length is %d bytes' % read_le16(f))

    # Read timestamp
    result.append(read_timestamp(f))

    # Read 3 x byte
    result.append(read_byte(f))
    result.append(read_byte(f))
    result.append(read_byte(f))

    # Read 1 x LE16
    result.append(read_le16(f))

    # Read 3 x pascal string
    result.append(read_pascal(f))
    result.append(read_pascal(f))
    result.append(read_pascal(f))

    return result

s = 'L\x00k\x07vQ\n\x01\xffh\x00\x04NGIN\x04MAIN6Product XX finished reprocessing cdc XXXXX at jesadr 0c\x00k\x07vQ\n\x01\xffF\x00\x06CSSPRD\x0cliab_checkerCCheckpointed to XXXXXXXXXXXXXXXX:XXXXXXX.XXX at jesadr 0 (serial 0)[\x00l\x07vQ\n\x00\xff\x01\x00\x05MLIFE\x06dayendBdayend 1 Copyright XXXX XXXXXXX XXXXXXX XXXXX XXX XXXXXX XXXXXXXX.'

f = StringIO(s)
print decode(f)
print decode(f)
print decode(f)

…产量。。。在

^{pr2}$

时间戳是5个小时,所以我假设是时区的问题。在

我想说你使用struct是对的,但是struct最糟糕的地方是你必须知道原始结构。在

也许阅读tcp规范和isos会有所帮助,尽管这仍然是一个地狱般的时间弄清楚它

在不知道二进制流的结构的情况下,很难进行解析,尽管有足够的时间对其进行反向工程,您可能会很接近或幸运。在

不过,如果客户机程序使用pickle协议,那就幸运了。在

相关问题 更多 >

    热门问题