CRC校验详解:从原理到算法

需积分: 9 1 下载量 12 浏览量 更新于2024-07-17 收藏 172KB PDF 举报
"这篇文档主要介绍了CRC(Cyclic Redundancy Check,循环冗余校验)的概念和计算原理,特别关注于CRC在单片机和嵌入式系统中的应用,如STM32-F0/F1/F2系列。CRC是一种广泛用于数据通信和存储中的错误检测方法,但并非纠错码。它通过一种特定的数学运算,即类似除法的运算过程,生成一个校验码,以检查数据传输或存储时是否出现错误。 CRC的工作原理是基于多项式除法,但这里的除法并非传统的算术除法,而是采用异或操作。在CRC校验中,被校验的数据被视为一个二进制数,而生成多项式则是一个固定的、具有特定位数的二进制数。计算过程可以理解为被校验数据除以生成多项式,得到的余数就是CRC校验码。由于实际操作中使用异或代替减法,这使得CRC计算更易于硬件实现。 例如,以120(1111000二进制)为例,传统除法得到的余数是3,而在CRC计算中,使用异或操作,被除数不变,但除数同样参与异或,得到的结果不同。在这个例子中,CRC运算得到的余数是6(110二进制)。这是因为每次异或相当于将被除数左移一位,并与除数进行比较,如果对应位相同,则不进行任何操作;若不同,则进行异或操作。 在单片机和嵌入式系统中,CRC校验通常用于串行通信协议,如USART或SPI,以及存储设备的数据完整性检查。STM32系列微控制器内置了CRC计算模块,可以直接对输入数据进行CRC校验,提高系统的可靠性。在STM32-F0/F1/F2系列中,用户可以通过配置寄存器来设置生成多项式,启动CRC计算,并读取结果。 为了正确计算CRC,需要遵循以下步骤: 1. 选择合适的生成多项式,这是一个固定的二进制数,例如CRC-16或CRC-32。 2. 初始化CRC寄存器,通常为全1状态。 3. 将数据逐字节或逐位与CRC寄存器进行异或操作。 4. 对结果进行位移操作,通常向左移一位。 5. 如果移位后最高位为1,则与生成多项式进行异或。 6. 重复步骤3至5,直到处理完所有数据。 7. 最终CRC寄存器的值就是CRC校验码。 通过这样的机制,CRC能够有效地检测出数据传输或存储过程中的一般突发错误,尽管它不能纠正错误,但对于大多数应用来说,CRC提供了一种简单且有效的错误检测手段。在实际应用中,结合适当的重传策略,CRC可以显著提高数据传输的可靠性。

-mkdir: java.net.UnknownHostException: CentOS764FCDW Usage: hadoop fs [generic options] [-appendToFile <localsrc> ... <dst>] [-cat [-ignoreCrc] <src> ...] [-checksum <src> ...] [-chgrp [-R] GROUP PATH...] [-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...] [-chown [-R] [OWNER][:[GROUP]] PATH...] [-copyFromLocal [-f] [-p] [-l] [-d] [-t <thread count>] <localsrc> ... <dst>] [-copyToLocal [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-count [-q] [-h] [-v] [-t [<storage type>]] [-u] [-x] [-e] <path> ...] [-cp [-f] [-p | -p[topax]] [-d] <src> ... <dst>] [-createSnapshot <snapshotDir> [<snapshotName>]] [-deleteSnapshot <snapshotDir> <snapshotName>] [-df [-h] [<path> ...]] [-du [-s] [-h] [-v] [-x] <path> ...] [-expunge] [-find <path> ... <expression> ...] [-get [-f] [-p] [-ignoreCrc] [-crc] <src> ... <localdst>] [-getfacl [-R] <path>] [-getfattr [-R] {-n name | -d} [-e en] <path>] [-getmerge [-nl] [-skip-empty-file] <src> <localdst>] [-head <file>] [-help [cmd ...]] [-ls [-C] [-d] [-h] [-q] [-R] [-t] [-S] [-r] [-u] [-e] [<path> ...]] [-mkdir [-p] <path> ...] [-moveFromLocal <localsrc> ... <dst>] [-moveToLocal <src> <localdst>] [-mv <src> ... <dst>] [-put [-f] [-p] [-l] [-d] <localsrc> ... <dst>] [-renameSnapshot <snapshotDir> <oldName> <newName>] [-rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...] [-rmdir [--ignore-fail-on-non-empty] <dir> ...] [-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]] [-setfattr {-n name [-v value] | -x name} <path>] [-setrep [-R] [-w] <rep> <path> ...] [-stat [format] <path> ...] [-tail [-f] [-s <sleep interval>] <file>] [-test -[defsz] <path>] [-text [-ignoreCrc] <src> ...] [-touch [-a] [-m] [-t TIMESTAMP ] [-c] <path> ...] [-touchz <path> ...] [-truncate [-w] <length> <path> ...] [-usage [cmd ...]] Generic options supported are: -conf <configuration file> specify an application configuration file -D <property=value> define a value for a given proper

2023-05-25 上传