在python中,有没有任何方法可以添加两个溢出字节?

在python中,有没有任何方法可以添加两个溢出字节?,python,overflow,checksum,Python,Overflow,Checksum,我正在使用pySerial从连接的设备读取数据。我想计算每个收到的数据包的校验和。数据包作为字符数组读入,实际校验和是数据包末尾的最后一个字节。为了计算校验和,我通常会对数据包负载求和,然后将其与实际校验和进行比较 通常在像C这样的语言中,我们会期望溢出,因为校验和本身只有一个字节。我不确定python的内部结构,但根据我对该语言的经验,它似乎会默认为一个更大的变量(可能是一些内部bigInt类或其他东西)。有没有办法模仿添加两个字符的预期行为,而不编写自己的实现?谢谢。当然可以,只需将结果的模

我正在使用pySerial从连接的设备读取数据。我想计算每个收到的数据包的校验和。数据包作为字符数组读入,实际校验和是数据包末尾的最后一个字节。为了计算校验和,我通常会对数据包负载求和,然后将其与实际校验和进行比较


通常在像C这样的语言中,我们会期望溢出,因为校验和本身只有一个字节。我不确定python的内部结构,但根据我对该语言的经验,它似乎会默认为一个更大的变量(可能是一些内部bigInt类或其他东西)。有没有办法模仿添加两个字符的预期行为,而不编写自己的实现?谢谢。

当然可以,只需将结果的模数调整回您想要的大小即可。你可以在最后或每一步计算模数。例如:

>>> payload = [100, 101, 102, 103, 104] # arbitrary sequence of bytes
>>> sum(payload) % 256 # modulo 256 to make the answer fit in a single byte
254 # this would be your checksum

为了改进前面的示例,只需按位并使用0xFF。不确定python是否默认进行优化

sum(bytes) & 0xFF

对字节求和,然后取模,如
sum(bytes)%256
(或
sum(bytes)&0xFF
),在许多编程语言中容易出现整数溢出,因为整数类型可以表示的最大值有限

但是,因为我们讨论的是Python,所以从技术上讲这不是一个问题:Python整数是任意精度的,所以不会发生整数溢出

如果要逐个元素执行模运算,可以使用
functools.reduce()


很好的简单例子。请注意,另一种常见的将数据截断为字节的方法是使用0xFF按位AND,因此“sum(payload)&0xFF”。@benhoyt看起来我们的想法是一样的;-)我不确定Python在幕后做了什么,但快速测试表明这两种方法花费的时间几乎相同。在任何情况下,求和都将是大部分工作。大多数优秀的优化编译器都会进行强度缩减,并将“%(2^n)”实现为“&”(1查看“dis.dis”(lambda x:x%256)的输出)“,似乎没有应用此优化。运行时的微小差异可能是因为实际和/修改操作只占总成本的很小一部分。当数据通过串行端口传输时,你们是否严重担心数学操作的性能??)CPython解释器对每个字节码指令执行数百条指令。
&
%
导致相同数量的字节码指令。与所有开销相比,它们相应的CPU指令不占用任何时间。(此外,
&
%
可能在现代处理器上以相同的时钟周期执行。)
>>> payload = [100, 101, 102, 103, 104] # arbitrary sequence of bytes
# (Python 3 uses functools.reduce() instead of builtin reduce() function)
>>> import functools
>>> functools.reduce(lambda x,y: (x+y)%256, payload)
254