Python:ABP位不翻转尽管尝试了多种方法,如何修复?

2024-06-16 10:30:27 发布

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

我修改了我的问题,以回应被搁置的问题。希望这能更好地符合SO标准。在

该程序的目的是建立和发送UDP包,使用交替比特协议作为一种简单的重发机制。我已经确认可以正确地发送和接收数据包。问题是ABP钻头及其翻转。在

我现在面临的问题是,尽管尝试了多种不同的方法,但我无法翻转用于确认接收到的数据包或ack是正确编号的ABP位。我首先发送一个ABP bit=0的包,作为响应,接收进程应该看到这个并发送ABP bit=0的ack。在接收到该值后,发送方程序将其ABP位转换为1,并发送具有此ABP位值的新数据包。接收者将得到这个,发送一个ABP bit=1的匹配的ack,发送者将接收,将其位翻转回0,并继续循环,直到程序完成信息发送。在

下面的代码,很抱歉篇幅过长,但它已经完成,可以运行了。程序有四个命令行参数,下面是我一直使用的命令:

% python ftpc.py 164.107.112.71 4000 8000 manygettysburgs.txt

在哪里ftpc.py文件是发送方程序的名称,164.107.112.71是IP地址,4000和8000是端口号,以及manygettysburgs.txt是我一直在发送的文本文件。如果使用不同的.txt文件,它应该不会有什么不同,但为了完全准确,请使用长度在8000到9000个字符之间的文件。在

^{pr2}$

在这段代码中,每次调用buildPacketHeader时,它都会执行flipBit作为其操作的一部分。flipBit应该为ABP翻转位的值。我将prints设置为在所有调用buildPacketHeader之后打印bit的新值,以便跟踪该值。然而,每当我运行程序时,我总是看到ABP位的相同值。在

我试过好几种方法,包括换成布尔。我尝试了一些改变:

def flipBit(val):   #flip ABP bit from 0 to 1 and vice versa
    if val == 0:
        val = 1
    else:
        val = 0

    return val

有些人用酒精代替:

def flipBit(val):
    val = not val
    return val

def flipBit(val):
    val = (True, False)[val]
    return val

我认为,由于过去的经验,许多方法实际上都是可行的选择。也就是说,我完全不明白为什么它在这个项目中没有像预期的那样工作。我会认为是我对python缺乏经验造成的,因为尽管现在已经使用了相当长的时间,但仍有一些特性让我无法理解。非常感谢任何帮助。在


Tags: 文件方法代码py程序txtreturndef
2条回答

我不明白您对pythonint的反对意见是什么,但是ctypes模块提供了一个低级可变对象的世界;例如

>>> import ctypes
>>> i = ctypes.c_ushort(12)  # 2-byte unsigned integer, initial value 12
>>> i
c_ushort(12)
>>> i.value += 0xffff - 12
>>> hex(i.value)
'0xffff'
>>> i.value += 1
>>> i.value  # silently overflowed to 0
0

这是我第一次回答我自己的问题,所以希望这是正确的。如果有人有补充或进一步的答案,那么请随时回答,或对这一点发表评论。在

最后,我通过在buildPacketHeader的return语句中添加另一个返回值来解决这个问题,这样除了返回一个字符串之外,我还返回了bit的新值。我通过在buildPacketHeader内部设置以下打印来确认其工作正常:

#add ABP
print "before:",ABP   #test line for flipBit
ABP = flipBit(ABP)
abp = str(ABP)
print "after:",ABP    #test line for flipBit

它的输出显示在这里(我很早就结束了,但是功能证明仍然可见)

^{pr2}$

可以看出,第二分组的前面是第一分组的后面,第三分组的前面是第二分组的后面。通过这个,你可以看到程序现在正在正确地翻转位。在

对buildPacketHeader所做的更改如下所示:

return Header

变成

return Header, ABP

以及对buildPacketHeader的调用:

filesizestr = buildPacketHeader(IP,PORT,1,bit)

成为

filesizestr, bit = buildPacketHeader(IP,PORT,1,bit)

这样的麻烦很简单。如果要更改值,请确保返回值。在

相关问题 更多 >