gpt4 book ai didi

python - 使用 binascii.crc32() 验证校验和

转载 作者:太空宇宙 更新时间:2023-11-03 16:25:13 26 4
gpt4 key购买 nike

我正在从 MCU 向我的计算机发送多条消息,并且我想使用 32 位循环冗余检查来验证消息是否正确。根据我的阅读,应该可以将 CRC 余数附加到最后一条消息并通过 CRC 函数运行它。如果消息没有错误,它应该返回零(我对吗?)然而,我使用 binascii 库函数 binascii.crc32() 来实现这一点并不成功。 .

举例来说,我想从 Python 文档中给出的示例内部检查消息(我使用的是 Python 3.5)。我将如何继续检查消息是否没有错误(当然在本例中是这样)?

crc = binascii.crc32(b"hello")
crc = binascii.crc32(b" world", crc)

check_for_error() # <--- ?

最佳答案

简单的方法是将字节形式的 CRC 附加到消息中。然后,当您收到消息时,计算除消息最后 4 个字节之外的所有字节的 CRC,并将其与附加的 CRC 字节进行比较。当然,这比您想要做的要复杂一些,但您可以将该策略应用于 MD5 或 SHA 系列等加密哈希。

但是,要执行您所要求的操作,您需要先从 0xffffffff 中减去 CRC32,然后再将其转换为字节并附加它。 CRC32实际上是一种逆CRC,它防止全零字节的消息具有零CRC。解码时,如果数据的 CRC + CRC 等于 0xffffffff,则消息可能有效。

Python CRC32 文档建议您使用

crc32(data) & 0xffffffff

而不是

crc32(data)

确保您在所有 Python 版本和平台上获得相同的数值。

这是一个快速的 Python 3 演示。

import binascii

maxcrc = 0xffffffff

def inverse_crc(data):
crc = binascii.crc32(data) & maxcrc
invcrc = maxcrc - crc
return invcrc.to_bytes(4, 'little')

def check_crc(data):
return binascii.crc32(data) & maxcrc == maxcrc

#Test

data = b"Hello, world"
newdata = data + inverse_crc(data)
print(check_crc(newdata))
newdata = b'0x00' + newdata
print(check_crc(newdata))

输出

True
False

请注意,您可能会收到误报:损坏的消息可能具有正确的 CRC。如果您需要更高级别的保护,您应该使用加密哈希。这仍然不完美,但如此大的哈希值出现误报的几率低。当然,计算 MD5 或 SHA 哈希比计算 CRC32 慢得多

关于python - 使用 binascii.crc32() 验证校验和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38048274/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com