Python:struct.pack在不同用途中出现错误
事实证明,我在这里使用struct.pack很好。由于复制/粘贴错误,我只是使用了错误的变量。记住在你自己的代码中要注意这些错误 如果你想看的话,原始问题在下面Python:struct.pack在不同用途中出现错误,python,sockets,struct,Python,Sockets,Struct,事实证明,我在这里使用struct.pack很好。由于复制/粘贴错误,我只是使用了错误的变量。记住在你自己的代码中要注意这些错误 如果你想看的话,原始问题在下面 我需要在UDP数据包上发送两条不同的信息作为有效载荷。这些数据包携带有关对象目的地的信息(即,目的地IP地址和目的地端口号)。我已经用其他方法确认我正在打包正确的信息。我的问题在于,一旦我发送了信息,就要对其进行解码。以下是我编码的信息,以及用于编码它们的方法: IP地址:xxx.xxx.xxx.xxx(xxx是0到255之间的任意数
我需要在UDP数据包上发送两条不同的信息作为有效载荷。这些数据包携带有关对象目的地的信息(即,目的地IP地址和目的地端口号)。我已经用其他方法确认我正在打包正确的信息。我的问题在于,一旦我发送了信息,就要对其进行解码。以下是我编码的信息,以及用于编码它们的方法: IP地址:xxx.xxx.xxx.xxx(xxx是0到255之间的任意数字)
#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)
编辑:复制/粘贴时出错,这确实是一个常见的敌人,在每次编码时都必须加以考虑
当前出现的问题是,虽然IP地址现在可以正常发送,但端口是错误的
发送端口为8000
收到的端口为@\x1f
我不完全确定如何解释该输出,如果有人能帮我弄清楚是怎么回事,我会非常感激。我的假设是,我要么犯了编码错误,要么抓取了错误的数据。至于数据,发送的字符串的排列应该是:
A4 6B 70 46 1F 40
IP为4字节,端口为2字节等
因此,我用以下两行文字获取这些信息:
packedIP = data[0:4] #grab 4-byte IP data
packedPort = data[4:6] #grab 2-byte port data
这是正确的,是吗?我仍然有点困惑Python字符串访问器是如何工作的。不过我得到的IP是正确的,所以我认为我没事
编辑:别担心这个问题,我以前在使用错误的变量时犯了更愚蠢的错误。因此理论上,连线上的字节应该是:
A4 6B 70 46 1F 40
但你解码的似乎是
40 1F 00 00 00 0A
第一组的最后两个字节与第二组的前两个字节(反向)看起来很可疑。我们可以看看您正在使用的代码吗?这可能有助于确定确切的问题
另外,机器是小端还是大端?当我使用字节压缩结构时,我通常使用网络排序(big-endian),这意味着您应该在结构字符串前面加一个感叹号(请参阅)
编辑:您的问题是这一行:
remoteIP = GBC.pack(int(PORT)) #needs another byte
应该是
remotePort = GBC.pack(int(PORT)) #needs another byte
我按照你的要求添加了源代码。我希望这足够了。我不确定endian的需要。你可能有一个复制/粘贴错误。当你编码端口号时,你正在覆盖
remoteIP
,而不是设置remotePort
。哈!多么愚蠢的错误!我已经更新了它,并将报告它的运行情况。谢谢你的帮助注意我在这段代码上犯的愚蠢的复制/粘贴错误。无关:您可以使用socket.inet\u aton()/.inet\u ntoa()函数对要通过网络发送的ip进行编码/解码。