3

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

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

4

3 回答 3

8

当然,只需将结果的模数重新调整为您想要的大小即可。您可以在最后或每一步进行模数。例如:

>>> 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
于 2009-06-10T21:04:45.353 回答
3

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

sum(bytes) & 0xFF
于 2009-06-10T21:32:32.333 回答
0

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

但是,由于我们讨论的是 Python,这在技术上不是问题:Python 整数是任意精度的,因此不会发生整数溢出。

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

>>> 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
于 2015-08-31T20:56:57.493 回答