前言
之前学习在朋友的服务器练习socket通信, 使用过crc校验码, 但只是网上随意找的方法进行校验,此次进行详细探究
什么是CRC校验码
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(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)*2R次方),这样C(x)的右边就会空出R位,这就是校验码的位置。用 C(x)*2R次方 除以生成多项式G(x)得到的余数就是校验码。
这里大家去了解下“模2除法”,就是按位异或,但是不会向上借位,有效位数小于除数位数则为余数
- 首先我们先选择一个除数, 一个用于在接收端进行校验时,对接收的帧进行除法运算的除数多项式$
- 看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串&#