gpt4 book ai didi

Python从tcp套接字解包二进制流

转载 作者:行者123 更新时间:2023-11-28 17:47:18 34 4
gpt4 key购买 nike

好的,所以我认为熟悉 Python 是个好主意。 (我有过Java、php、perl、VB等经验,不是精通,只是中级知识)

所以我正在尝试编写一个脚本,该脚本将从套接字中获取数据,并将其转换为屏幕。粗略的开始代码如下:

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

我有这个流的输出与不同的程序,(这写得非常糟糕,这就是我解决这个问题的原因)

当我打印出 recv 时,它是这样的......

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.

通过观察这个并将其与其他程序的输出进行比较,我推测它应该像这样分解..

b'L\x00k\x07vQ\n\x01\xffh\x00\x04NGIN\x04MAIN6Product XX finished reprocessing cdc XXXXX at jesadr 0'

有相应的信息

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

现在,根据我的研究,看起来我需要使用“结构”并解压它,但是我不知道它的原始结构,我只知道从中可以得到什么信息,并且是老实说,我很难弄清楚这个问题。

我已经使用 python 解释器尝试解包该行的点点滴滴,但这是一个令人沮丧的练习。

如果有人至少可以帮助我入门,我将不胜感激。

谢谢

最佳答案

好的。我想我已经设法解码了它,尽管我不确定中间的 16 位值。

这个 Python 2.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)

...产量...

['Total message length is 76 bytes', 'Tue Apr 23 05:00:43 2013', 10, 1, 255, 104, 'NGIN', 'MAIN', 'Product XX finished reprocessing cdc XXXXX at jesadr 0']
['Total message length is 99 bytes', 'Tue Apr 23 05:00:43 2013', 10, 1, 255, 70, 'CSSPRD', 'liab_checker', 'Checkpointed to XXXXXXXXXXXXXXXX:XXXXXXX.XXX at jesadr 0 (serial 0)']
['Total message length is 91 bytes', 'Tue Apr 23 05:00:44 2013', 10, 0, 255, 1, 'MLIFE', 'dayend', 'dayend 1 Copyright XXXX XXXXXXX XXXXXXX XXXXX XXX XXXXXX XXXXXXXX.']

时间戳超过 5 小时,所以我假设这是时区问题。

关于Python从tcp套接字解包二进制流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222310/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com