C 语言 CRC 程序2025年3月17日 | 阅读 10 分钟 在数据传输过程中,可能会出现噪声干扰,导致发送方到接收方的数据数字信号发生变化。因此,发送方提供的数据可能与接收方接收到的数据不匹配。我们将数据位的变化称为错误,为了避免这种情况,使用各种错误检测技术来检查接收到的数据。循环冗余校验(CRC)算法就是其中一种。 范围
引言循环冗余校验(CRC)算法用于检测错误并验证发送方发送的数据的准确性。除了需要传输的数据外,CRC还需要一个生成多项式来通过二进制除法计算校验值。为了确保数据的真实性,校验值或CRC会与数据一起发送给接收方。 可以使用多项式的次数来表示将要传输给接收方的数据,以多项式形式表示。例如,长度为7的二进制数据1010101可以表示为: x7+x5+x3+1 由于该表示形式的值为0,因此不表示位值0。 生成多项式也可以用二进制数据表示。数据多项式的次数必须小于生成多项式的次数,并且必须大于0。根据生成多项式的次数,CRC可以分为多种标准。CRC-8标准使用次数为8的生成多项式,CRC-16标准使用次数为16的生成多项式。这是一个简单的生成多项式示例。 x5+x4+x2 需要注意的是,循环冗余校验(CRC)也可以用作哈希函数。然而,由于CRC-8只能产生256(2^8)种不同的值。 CRC的步骤如下:发送方:
校验值,即CRC,用数学公式表示为: ![]() 在此n指的是生成多项式的位数。接收方:
二进制除法的步骤与常规多项式除法相同,如下所示:
循环冗余校验(CRC)的一个有趣特性是以下过程:CRC(x^y^z) == crc(x)^ crc(y)^ crc(z)。 符号^表示XOR运算。如果我们对三段数据进行XOR运算,然后再对结果进行CRC计算,那么CRC结果将与分别对每段数据进行CRC计算然后对结果进行XOR运算相同。 注意:当两个输入相同时,XOR运算符返回0;而在所有其他情况下,它返回1。C语言CRC实现CRC程序可以在C语言中使用两种方法实现。第一种方法使用字符数组,第二种方法使用位操作策略。 算法 CRC程序的实现算法如下:
CRC函数的算法如下:
XOR函数所用的方法基于以下XOR运算符的真值表:
以下是接收方用于错误检查的算法:
代码 输出 Enter data to be transmitted: 1001101 Enter the Generating polynomial: 1011 ---------------------------------------- Data padded with n-1 zeros : 1001101000 ---------------------------------------- CRC or Check value is : 101 ---------------------------------------- Final data to be sent : 1001101101 ---------------------------------------- Enter the received data: 1001101101 ----------------------------- Data received: 1001101101 No error detected 说明 由于传输和接收的数据相同,因此没有信号错误。 Enter the received data: 1001001101 ----------------------------- Data received: 1001001101 Error detected 存在信号错误,因为发送的数据与接收的数据不同。 程序的执行时间和空间需求分别由时间复杂度和空间复杂度表示。使用大O符号表示时间复杂度和空间复杂度。由于同时推断出两个for循环,因此程序的time complexity为O(n^2)。 由于使用了单维字符数组来存储n个字符,因此程序的space complexity为O(n)。 使用位操作实现CRCCRC程序通过位操作技术实现如下。 算法 使用位操作技术实现C语言CRC的方法如下:
用于将数字从十进制转换为二进制的算法如下:
输出 Enter the data to be transmitted: 1001101 Enter the generator polynomial: 1011 Check value or CRC: 101 Data to be sent: 1001101101 ...................................... Process executed in 1.11 seconds. 说明 程序的执行时间和空间需求分别由时间复杂度和空间复杂度表示。使用大O符号表示程序的复杂度。由于一次只假定一个for循环,因此程序的time complexity为O(n),并且由于字符存储在单维字符数组中,因此其space complexity也为O(n)。 结论
下一个主题C语言的二分搜索算法 |
我们请求您订阅我们的新闻通讯以获取最新更新。