Python:错误结构包不同的用途

2024-04-20 04:03:30 发布

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

原来我的用法结构包在这里很好。我只是因为复制/粘贴错误而使用了错误的变量。记住,在你自己的代码中要注意这样的错误!在

如果你想看的话,原来的问题在下面。在


我需要发送两个不同的信息作为有效负载在UDP包。这些数据包携带有关对象目的地的信息(即目标IP地址和目标端口号)。我已经用其他方法确认我包装的信息是正确的。我的问题在于,一旦我发送信息,就要对其进行解码。以下是我编码的信息,以及用于编码的方法:

IP地址:xxx.xxx.xxx.xxx(xxx是0到255之间的任意数字)

  1. IP地址被分成四个数字的列表。

  2. 四个数字的列表使用结构('4B'),其中每个字节是列表编号之一。

  3. 在接收端,使用相同的结构(“4B”)

  4. 使用四个未打包的值和正确放置的句点重新构造表示IP地址的字符串。

对于端口号:

端口号:单个整数,通常为千(即8000,我的测试值)

  1. 使用存储结构(“H”)(这是一个包含数字的2字节对象)

  2. 使用相同的结构(“H”)在接收端

我认为我一直在做编码部分的事情,因为我在编码和发送值之前检查了它们,它们是正确的。当我把它们放在另一端解码时,这些值都是错误的,我不知道为什么。下面是一个例子:

输入IP和端口:

IP:164.107.112.70 端口:8000

输出IP和端口:

IP:64.31.0.0 端口:10

我在这里犯了什么错才会遇到这些问题?在

编辑:这里有一些代码。在

#pack IP for transport

#split into four 1-byte values
SplitIP = IP.split('.')

#create a 4-byte struct to pack IP, and pack it in remoteIP
GB = struct.Struct("4B")

remoteIP = GB.pack(int(SplitIP[0]),int(SplitIP[1]),int(SplitIP[2]),int(SplitIP[3]))
#remoteIP is now a 4-byte string of packed IP values


#pack Port for transport

#create a 2-byte struct to pack port, and pack it in remotePort
GBC = struct.Struct("H")

remoteIP = GBC.pack(int(PORT))  #needs another byte
#remoteIP is now a 2-byte string of packed IP values


#Join the two parts together

remoteIP += str(remotePort)

在此之后,一些额外的元素被打包(1字节的标志、ABP的1字节0/1值(尚未实现)和有效负载(在本例中,文件大小为4字节值)。然后通过socket send命令将它们发送到同一台机器上客户机提供的端口号的另一个进程(在我的测试中,使用4000)。在

^{pr2}$

编辑:复制/粘贴出错,这是一个常见的敌人,必须在每一次编码时都加以考虑。在

当前出现的问题是,虽然IP地址现在可以正常发送,但端口错误。在

发送端口是8000

接收端口是@\x1f

我不太清楚如何解释这个输出,如果有人能帮我弄清楚是怎么回事,我会非常感激的。我的假设是,我要么是编码出错,要么是抓取了错误的数据。对于数据,发送的字符串的排列应该是:

IP为4字节,端口为2字节,等等

所以我用以下两行来获取信息:

packedIP = data[0:4]    #grab 4-byte IP data
packedPort = data[4:6]  #grab 2-byte port data

这是正确的,是吗?我仍然对Python字符串访问器的工作方式有点困惑。IP我是对的,所以我觉得我没事。在

编辑:以前不要再提这个问题了,我用错误的变量犯了更多愚蠢的错误。在


Tags: 端口ip信息编码字节错误数字byte
1条回答
网友
1楼 · 发布于 2024-04-20 04:03:30

所以理论上,线路上的字节应该是:

A4 6B 70 46 1F 40

但你破解的似乎是

^{pr2}$

第一组的最后两个字节是第二组中的前两个字节(颠倒),这看起来很可疑。我们能看看你用的代码吗?这可能有助于确定确切的问题。在

还有,机器是小端还是大端?当我使用字节压缩结构时,我通常使用网络排序(big-endian),这意味着您应该在结构字符串前面加上感叹号(参见http://docs.python.org/2/library/struct.html)。在

编辑:你的问题是这一行:

remoteIP = GBC.pack(int(PORT))  #needs another byte

应该是的

remotePort = GBC.pack(int(PORT))  #needs another byte

相关问题 更多 >