CRC16计算

本文介绍了CRC(循环冗余校验)的工作原理,强调了CRC在数据传输校验中的准确性,并通过一个CRC-8的例子详细阐述了CRC的计算过程。同时提供了CRC计算的伪代码及实际代码实现,讨论了在处理大文件时的部分读取和计算策略。
摘要由CSDN通过智能技术生成

两个设备传输数据的时候需要校验数据是否准确,此时就需要校验码,校验通常有奇偶校验,和校验和CRC校验,这三种校验用的比较多,但是CRC校验是其中最准确的,因此我看了一下CRC校验的算法,下面是一些整理。

首先说一下CRC校验的工作原理

循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设要发送的信息用多项式C(X)表示,将C(x)左移R位(可表示成C(x)*xR),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*xR 除以生成多项式G(x)得到的余数就是校验码。
上面是CRC的原理,其实我根本看不懂,都说CRC的生成多项式是有很高深的学问的,我就只关心如何实现了。下面看一看如何实现的,先来看一个例子
举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,即生成多项式是9位的二进制串111010101。

1.先将数据左移8位,因为我们用的是CRC-8,如果是CRC-16就左移16位
10100111010000100000000

2.数据与生成多项式进行模2运算,即异或运算,判断数据的最高位,如果为0,则将数据左移1位,如果为1,则将数据与生成多项式做异或运算

1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 //为1,异或
1 1 1 0 1 0 1 0 1
0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0//为0,左移一位的

1 0 0 1 1 0 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0//为1,异或
1 1 1 0 1 0 1 0 1
0 1 1 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0//为0,左移
.
.
.
.
由上面的两步最后可以得到最后生成的一个余式,即我们需要的CRC(循环冗余校验码)。

上面只是简单的计算,下面给出伪代码

设置CRC的寄存器crc_reg,寄存器为16位
crc_reg = crc_reg ^ (数据 << 8 )
while(处理数据长度)
if(crc_reg 最高位为1)
crc_reg = (crc_reg << 1 )^ CRC-16生成多项式
else
crc_reg = (crc_reg << 1 )

得到crc_reg

下面是真正的代码,这个是我找的

#include <stdio.h>

#define POLY    0x1021  

/** 
 * Calculating CRC-16 in 'C'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值