当前位置:首页 » 网络连接 » 计算机网络crc实验用c实现
扩展阅读
桂林工业平板电脑有哪些 2024-11-18 16:16:32
移动网络光纤红灯 2024-11-18 16:15:55

计算机网络crc实验用c实现

发布时间: 2022-03-08 09:03:55

Ⅰ 用C语言实现CRC编码程序

#include <stdio.h>
#include <string.h>
#include "stdlib.h"
unsigned int char2int(char *str)
{
unsigned int count=0, ret=0;
for(count = 0; count<strlen(str);count++)
{
ret = ret<<1;
if('0' != str[count])
{ ret+=1;}
}
return ret;
}

unsigned int getR(char *str)
{
unsigned int c =0 ;
int ret = strlen(str)-1;
for(c=0;c < strlen(str);c++)
{if(str[c] != '0')<br/> {return ret-c;}
}
}

int getRi(unsigned int num)
{
int c =0;
for(;num != 0; c++)
{num = num>>1;}
return c;
}

void CRC(char *scode, char *p, char*g )
{
unsigned int iP = char2int(p);
unsigned int iG = char2int(g);
unsigned int r= getR(g);
unsigned int code = iP << r;
unsigned int yx = code;
for(;getRi(yx) >= getRi(iG);)
{ yx = yx ^ (iG<<(getRi(yx) - getRi(iG)));}
code += yx;
itoa(code,scode,2);
}

void main() //定义主函数
{
char data[8]="" , bds[8]="",code[16]="";
printf("数据:");
scanf("%s", data);
printf("表达式:");
scanf("%s", bds);
CRC(code,data,bds);
printf("编码:%s",code);
}

Ⅱ 算法上机实验如图所示,用c语言实现

#include<stdio.h>

#include<stdlib.h>

struct node {

int data;//数据域

struct node *R;//左孩子

struct node *L;//右孩子

};

int a[] = {1, 2, 3, -1, -1, -1, 4, 5,7,-1,-1,-1,6,-1,-1};//二叉树序列

int k = 0;

node* buildTree(node *tree) {//创建二叉树

int data=a[k++];//

if (data== - 1) {//-1代表空结点

tree = NULL;

}

else {//非空结点

tree = (node*)malloc(sizeof(node));//分配内存

tree->data = data;//数据域赋值

tree->L = tree->R = NULL;//左右孩子赋空

tree->L=buildTree(tree->L);//前往左孩子

tree->R=buildTree(tree->R);//前往右孩子

}

return tree;//返回根结点地址

}

void dfs1(node *tree) {//前序遍历

if (tree) {

printf("%d ", tree->data);

dfs1(tree->L);

dfs1(tree->R);

}

}

void dfs2(node *tree) {//中序

if (tree) {

dfs2(tree->L);

printf("%d ", tree->data);

dfs2(tree->R);

}

}

void dfs3(node *tree) {//后序

if (tree) {

dfs3(tree->L);

dfs3(tree->R);

printf("%d ", tree->data);

}

}

void level(node *tree){

//层次遍历,类似与bfs(广度优先搜索)

//需要一个队列作为辅助数据结构

node* q[100];//队列

int f=0,r=0;//头,尾指针

q[r++]=tree;//根结点入队

while(f!=r){

node *t=q[f++];//出队

printf("%d ",t->data);//输出

if(t->L!=NULL){//非空左孩子入队

q[r++]=t->L;

}

if(t->R!=NULL){//非空右孩子入队

q[r++]=t->R;

}

}

}

int count(node *tree){

if(tree==NULL){

return 0;

}

else{

int n,m;

n=count(tree->L);//左子树结点个数

m=count(tree->R);//右子树结点个数

return n+m+1;//返回左右子树结点个数之和

}

}

int main() {

node *tree = NULL;

tree=buildTree(tree);

printf(" 前序遍历: ");

dfs1(tree);

printf(" 中序遍历: ");

dfs2(tree);

printf(" 后序遍历: ");

dfs3(tree);

printf(" 层次遍历: ");

level(tree);

printf(" 二叉树结点个数:%d",count(tree));

return 0;

}

Ⅲ 用C++或C语言编一个CRC校验程序

算法忘了,要不就帮你写了

Ⅳ 大侠给我个完整的crc 程序 用C语言实现的,能在PC机上运行的。我马上拿出100分。。。

楼主程序中调用函数cal_crc()的方式不正确。函数cal_crc()用于计算输入串的校验码,因此函数输入参数包含输入串及该串的长度。
建议将main()函数修改为:
#include <string.h>
void main()
{
unsigned char buf[] = "ABCDEFG1234567"; // 输入串
unsigned char len = 14; // 输入串的长度
unsigned int crc;
crc = cal_crc(buf, len);
}

最后需要注意的是,输入串的长度不能大于256个字节。上述例子程序中假定了输入串为字符串,实际上,还可以是字节串,此时变量len表示字节串的包含的字节个数。

Ⅳ 求一个C语言实现的CRC16位校验码生成程序,不用实现校验,只要给定一个待传输数,能生成最终CRC码就好。

uchar code CRCTable[256]={
0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};

/*输入:待校验的数据首地址+长度 输出:校验和*/
uchar CRC_VAL(uchar *buf,uchar len)
{
uchar i,crcdat = 0;
for(i = 0; i<len; i++)
crcdat = CRCTable[*(buf+i)^crcdat];
return crcdat;
}

Ⅵ crc 计算机网络

2017年12月29日,星期五,

兄弟,我先给你简单再捋一遍CRC编码的概念和计算公式,原理明白了,以后不管碰到什么样的题,你都会迎刃而解了。

首先,需要知道如下几个概念,

  1. CRC编码,就是你题目中所说的“待发字串”,它是经加工后带有CRC校验的待发送信息,

  2. CRC校验码,就是你题目中所说的“CRC循环冗余码”,以下都简称为CRC校验码,它是通过CRC规则计算得来,

  3. 多项式,即真实信息,就是未经CRC编码规则处理的原始的信息,就是你题目中说的“已知信息码”,原始的真实信息有两种表现形式,以本题为例,

    a、原始信息的 二进制字串(形式):1000100101,

    b、原始信息的 多项式(形式):X^9+X^5+X^2+1,

    X^9+X^5+X^2+1多项式,就是由原始信息的二进制形式1000100101得来的,多项式中每一个因数都对应二进制形式 1000100101 中值为1的那一位,X^9 X^5 X^2就是2^9+2^5+2^2,那表示二进制数的权位,

    1000100101

    1*2^90*2^80*2^70*2^6 1*2^5 0*2^4 0*2^3 1*2^2 0*2^11*2^0

    2^0=1...2^9=1 000 000 000,凡是二进制字串中值为1的权位都出现在了多项式中,例如,二进制字串最高位(左1)的1,就是2^9,所以它出现在了多项式中,形状为X^9,而二进制数串中值为0的权位都没有出现在多项式中,可以数一下,二进制数串中有4个1,所以对应的多项式中有4个因子:X^9、X^5、X^2、1,其中多项式的最后一个因子1,其实就是X^0,而我们都知道,任何数的0次幂都是1(0除外),可以看出,这两种形式是等价的,即1000100101=X^9+X^5+X^2+1,当我们再遇到多项式时,就是去数原始信息(1000100101)中的1,然后把它的值为1的权位放到一起,写成式子(X^9+X^5+X^2+1),两者意义是一样的,从二进制形式能推导出多项式,也可以从多项式推导出二进制形式,

  4. 生成多项式,就是你题目中提到的“G(x)=X^5+X^4+X^2+1”,生成多项式也可以写成二进制形式,X^5+X^4+X^2+1其对应的二进制形式:110101,

  5. 通常,我们为了方便说明问题将生成多项式叫做:G(x),这里请注意,需要将

“生成多项式”和“多项式”进行区分,G(x)中的G就是generator polynomial,生成多项式的意思,

多项式:指的是原始信息1000100101中所有权位为1的权位写在一起的形式X^9+X^5+X^2+1

生成多项式:是人为指定的多项式,由编码人指定的东西,本例被人为指定成X^5+X^4+X^2+1即 110101 ,这个生成多项式是人为指定的,不是固定的,个人理解你指定成X^5+X^3+X^2+1也行,制定成X^5+X^4+X^3+X^2+1也行,


好了,接下来,我们要说最关键的CRC的定义和计算过程了,

CRC的定义:

  • 多项式*2^(G(x)的最高次幂指数,你给的图片题目中G(x)的最高次幂指数是5)/G(x)=CRC校验码;

    用文字表达,就是原始数据信息乘以,2的 【生成多项式中最高幂指数】 次幂,乘2的多少次幂,就是在右边加几个0,比如乘以2^2,就是在右边加2个零,因为是二进制数,所以乘几个2就是加几个零,和十进制数乘几个10就是加几个零道理一样,然后再去除以生成多项式,请注意,这里的除,不是数学中的除法,而是指计算机中的模二除运算,实际上就是逻辑异或运算,说白了,就是将除数和被除数高位,进行左对齐后,相同为0,不同为1,然后一直除下去,直到得到最后的余数为止,这个余数就是我们需要的CRC校验码,而且这个最后得到的余数,取几位由生成多项式中最高幂指数决定,最高幂指数是5就取5位,最高幂指数是6就取6位,最高幂指数是4就取4位,是根据生成多项式的最高次幂来定取几位的.本例中,最高次幂是5,所以,最后的余数是5位二进制数,

    X^5+X^4+X^2+1写成二进制就是: 110101

  • 你的图片题目中,G(x)=X^5+X^4+X^2+1,也就是生成多项式是110101,

结合本题,我们来做一遍,原始数据:1000100101,生成多项式:110101,根据上面的规则有,

1000100101*2^5=1000100101 00000



把原始值右边加上5个零:1000100101 00000之后,去除以生成多项式:110101

1000100101 00000

110101

----------------------------

0101110101 00000

左对齐,并开始按位异或,得0101110101 00000,



进行第二次除运算:

101110101 00000

110101

--------------------------

011011101 00000

左对齐,再按位异或,得到011011101 00000




开始第三次除运算:

11011101 00000

110101

--------------------

00001001 00000

左对齐,再按位异或,得到00001001 00000



进行第四次除运算:

100100000

110101

-----------------

010001000

左对齐,再异或,得到010001000



进行第五次除运算:

10001000

110101

------------

01011100

左对齐,再异或,得到01011100



进行第六次除运算:

1011100

110101

-------------

0110110

左对齐,再异或,得到0110110



进行第七次,最后一次除运算:

110110

110101

------------

000011


最终余数为000011,而由G(x)的最高次幂X^5的幂指数决定了,CRC校验码取5位,因此,最终得到的CRC校验码为:00011,

  • 多项式*2^(G(x)的最高次幂指数,本例中G(x)的最高次幂指数是5)+G(x)=最终在物理线路上传送的CRC编码待发字串,

用文字表达就是,原始数据乘以,2的 【生成多项式中最高幂指数】 次幂,然后再加上生成多项式,最终得到要在线路中传送的CRC编码待发字串,

接着,以本例进行余下的计算,原始数据:1000100101,CRC校验码(CRC循环冗余码)为:00011,

根据上面的定义,有:

1000100101*2^5=1000100101 00000,

1000100101 00000

+ 00011

----------------------

100010010100011

所以最终的“待发字串”CRC编码为:100010010100011

Ⅶ 关于计算机网络的crc计算

我们知道,一台主机向另外一台主机发送报文的时候,需要一层层经过自己的协议栈进行数据封装,到达最后一层(四层协议的网络接口层)时需要在帧尾部添加FCS校验码(通过CRC算法得出)。当对端主机收到时,在接收端同样通过CRC算法进行验证,确认传输过程中是否出现错误。它只能确认一个帧是否存在比特差错,但没有提供解决措施。


循环冗余校验的原理

  • 在发送端,先把数据划分为组(即:一帧)。假定每组 k 个比特。

  • 在每组后面,添加供差错检测用的 n 位冗余码一起发送。即:实际发送长度为:k+n 比特。

  • 发送前双方协商n+1位的除数P,方便接收方收到后校验。

  • 给K比特的数据添加除数减一个0(P-1)作为被除数,与第三步确定的除数做“模2除法”。得出的余数即FCS校验序列,它的位数也必须是(P-1)。

  • 将FCS校验序列添加至K个比特位的后面发送出去。

  • 接收方对接收到的每一帧进行校验,若得出的余数 R = 0,则判定这个帧没有差错,就接受(accept)。若余数 R ≠ 0,则判定这个帧有差错,就丢弃。

  • 对“模2除法”进行说明:

    “模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。

    计算示例


    那么接收方拿到的就是:101001001。再以它为被除数,1101为除数进行“模2除法”。

Ⅷ 我要用C语言编写CRC16效验码。通过输入一个串然后计算出CRC16效验码。例如:输入010600001388计算得到849C

int cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned int crc_value =0;
while(len--)
{
for(i=0x80; i!=0; i>>=1 )
{
if (crc_value&0x8000)
crc_value = (crc_value << 1) ^0x8005 ;
else
crc_value = crc_value << 1 ;
if(*ptr&i)
另外,站长团上有产品团购,便宜有保证

Ⅸ 计算机网络原理的计算题(CRC校验和数据传输问题)

第一题:进行模2除法时被除数错了,应该是M*2^4,不是M*2^5,因为多项式是4阶的,在M后面添4个0