CRC码计算及原理(FCS帧校验序列生成) 您所在的位置:网站首页 crc校验结果可能为0吗 CRC码计算及原理(FCS帧校验序列生成)

CRC码计算及原理(FCS帧校验序列生成)

2024-05-09 14:13| 来源: 网络整理| 查看: 265

我们知道在以太网帧的末尾有一个叫FCS的东西。 全称:Frame Check Sequence,中文名:帧检验序列 这个东西是用来检验我们的数据是否在传输的过程中被破坏(不一定是收到攻击,也可能是一些物理干扰),以更好的安排重发。 而其中最常用的,也是检错能力很强的,就是CRC,循环冗余校验码。

操作流程一个小背景知识

模二除法,或者说在数域{1,0}上的除法。 与普通除法类似,它也可以列竖式计算,但是唯一不同的,是相减的那一步。 我们这里的除法,在相减时,遵循一下规则:

1-1=01-0=10-1=10-0=0不进位,也不借位

举个例子。

CRC码计算及原理(FCS帧校验序列生成)_FCS

我相信应该很清楚了。(手画的,不容易)

生成

首先,我们需要一个除数,这个除数可以按照某个行业标准来,比如:

IBM的SDLC(同步数据链路控制)规程中使用的CRC-16为:11000000000000101,在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16为:11000000000100001。

当然这里做个实验,我们也可以随机生成,但是有一点要求,最高位和最低为必须为1,这一点需要注意。

接下来,我们把数据左移(k-1)位,补零,这就是我们的被除数。 然后用这个被除数和除数做模二除法得到余数。 这个余数(k-1位,不足的话,左侧补零),就是加在数据末尾的FCS。 然后我们把它加在数据末尾即可。

校验

那么我们如何校验呢? 直接把我们得到的串(包含FCS),对除数再做一次模二除法,如果余数是零,则说明数据完好。如果不为0,则说明数据遭到破坏,需要安排重发。

代码实现

相信看了上面的内容,应该很容易实现代码,下面给出我写的代码:

#include#include#include#include#includeusing namespace std;struct bin{//二进制数据 int num[100000]; int len; void init(){//初始化为0 len=1; memset(num,0,sizeof(num)); } void read(){//读入数字 char c[100000]; scanf("%s",c); len=strlen(c); for(int i=0;i=0;i--){ if(num[i]==1){ len=i+1; return; } } len=1; } void gen(int k){//随机生成 len=k; num[len-1]=num[0]=1; for(int i=1;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有