繁体   English   中英

使用struct.pack和python创建数据包

[英]Creating packet using struct.pack with python

我想使用python创建一个数据包。 数据包有4个字段,每个字段为32位。 我有示例代码:

import socket, sys, os, struct
field1 = 1
field2 = '255.255.255.0'
field3 = 20
field4 = '192.168.0.1'

struct.pack=('!L4sL4s',field1,field2,field3)

但我没有输出。 如何格式化此数据包,以便每个变量可以有4个字节。

>>> struct.pack('!L4sL4s', field1, socket.inet_aton(field2),
                           field3, socket.inet_aton(field4))
'\x00\x00\x00\x01\xff\xff\xff\x00\x00\x00\x00\x14\xc0\xa8\x00\x01'

您将元组('!L4sL4s',field1,field2,field3)分配给struct.pack 你需要像这样调用struct.packstruct.pack('!L4sL4s',field1,field2,field3,field4) (no = sign)。

pack调用的结果将返回给您,您可以将其分配给变量。 你的行应该是这样的:

my_packet = struct.pack('!L4sL4s',field1,field2,field3)

请注意,此线期望一个unsigned long int类型,则长度为4的字符串,那么长整型,然后长度4的串field2field4比这两个长。 尝试使用len(field2)来查看它有多长,例如!

你正在做一个包装字符串和整数的奇怪组合。 您可以将字符串打包为无符号整数,如下所示:

>>> import struct
>>> field2 = '255.255.255.0'
>>> struct.pack('4B',*tuple(int(x) for x in field2.split('.')))
'\xff\xff\xff\x00'

考虑到这一点,您可能想做的是:

from itertools import chain
f2_int = map(int,field2.split('.'))
f4_int = map(int,field4.split('.'))
struct.pack('L4BL4B',*chain([field1],f2_int,[field3],f4_int))

演示:

>>> import struct
>>> field1 = 1
>>> field2 = '255.255.255.0'
>>> field3 = 20
>>> field4 = '192.168.0.1'
>>> from itertools import chain
>>> f2_int = map(int,field2.split('.'))
>>> f4_int = map(int,field4.split('.'))
>>> struct.pack('L4BL4B',*chain([field1],f2_int,[field3],f4_int))
'\x01\x00\x00\x00\xff\xff\xff\x00\x14\x00\x00\x00\xc0\xa8\x00\x01'

事实证明,我可能在这里重新发明了轮子。 另外,您可能需要查看socket.inet_aton ,看起来它会将您的IP地址正确打包为32位,如您所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM