首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用binascii.crc32()验证校验和

使用binascii.crc32()验证校验和
EN

Stack Overflow用户
提问于 2016-06-27 07:35:00
回答 1查看 2.7K关注 0票数 2

我正在发送多条消息从单片机到我的计算机,我想使用32位循环冗余检查,以验证这些消息是正确的。根据我所读到的,应该可以将CRC余数附加到最后一条消息中,并通过CRC函数来运行。如果消息没有错误,那么它应该返回零(我是对的吗?)但是,我在使用binascii库函数binascii.crc32()实现这个功能时没有成功。

例如,假设我想在内部检查Python文档中给出的示例中的消息(我正在使用Python3.5)。我将如何继续检查消息是否没有错误(当然,在本例中是这样的)?

代码语言:javascript
复制
crc = binascii.crc32(b"hello")
crc = binascii.crc32(b" world", crc)

check_for_error() # <--- ?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-27 09:20:39

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

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

Python CRC32文档推荐您使用

代码语言:javascript
复制
crc32(data) & 0xffffffff

而不是

代码语言:javascript
复制
crc32(data)

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

这里有一个快速的Python 3演示。

代码语言:javascript
复制
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))

输出

代码语言:javascript
复制
True
False

请注意,您可以得到假阳性:损坏的消息可能有正确的CRC。如果需要更高级别的保护,则应使用加密散列。这仍然不是十全十美的,但是在这样大的哈希中出现假阳性的几率是非常低的。当然,计算MD5或SHA哈希要比计算CRC32慢得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38048274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档