有什么方法在Python中对两个字节进行溢出相加吗?

4 投票
3 回答
7883 浏览
提问于 2025-04-15 12:10

我正在使用pySerial来读取连接设备的数据。我想计算每个接收到的数据包的校验和。这个数据包是以字符数组的形式读取的,实际的校验和是数据包最后一个字节,也就是在数据包的末尾。为了计算校验和,我通常会对数据包的有效载荷进行求和,然后将结果与实际的校验和进行比较。

通常在像C这样的语言中,我们会遇到溢出的问题,因为校验和本身只有一个字节。我不太确定Python的内部机制,但根据我对这个语言的了解,它似乎会默认使用更大的变量(可能是某种内部的大整数类)。有没有办法在不自己实现的情况下,模拟两个字符相加时的预期行为呢?谢谢。

3 个回答

1

把字节加起来,然后取余数,比如用 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
3

为了改进之前的例子,可以用0xFF进行按位与运算。不太确定Python是否默认会进行这种优化。

sum(bytes) & 0xFF
9

当然可以,只需要对你的结果进行取模运算,这样就能把它调整到你想要的大小。你可以在最后一步进行取模,也可以在每一步都进行。比如:

>>> 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

撰写回答