Python:struct.pack在不同用途中出现错误

Python:struct.pack在不同用途中出现错误,python,sockets,struct,Python,Sockets,Struct,事实证明,我在这里使用struct.pack很好。由于复制/粘贴错误,我只是使用了错误的变量。记住在你自己的代码中要注意这些错误 如果你想看的话,原始问题在下面 我需要在UDP数据包上发送两条不同的信息作为有效载荷。这些数据包携带有关对象目的地的信息(即,目的地IP地址和目的地端口号)。我已经用其他方法确认我正在打包正确的信息。我的问题在于,一旦我发送了信息,就要对其进行解码。以下是我编码的信息,以及用于编码它们的方法: IP地址:xxx.xxx.xxx.xxx(xxx是0到255之间的任意数

事实证明,我在这里使用struct.pack很好。由于复制/粘贴错误,我只是使用了错误的变量。记住在你自己的代码中要注意这些错误

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


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

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

  • IP地址被分成四个数字的列表

  • 四个数字的列表使用struct.struct('4B')进行打包,其中每个字节都是列表中的一个数字

  • 在接收端,使用相同的结构(“4B”)接收和解包

  • 使用四个未打包的值和正确放置的句点来重构表示IP地址的字符串

  • 对于端口号:

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

  • 使用struct.struct(“H”)存储(这是一个2字节的对象,将保存数字)

  • 在接收端使用相同的struct.struct(“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)

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

    当前出现的问题是,虽然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进行编码/解码。