[C语言]模拟人工计算CRC校验码

组成原理课程设计要实现CRC码的生成与校验,然而并不会用硬件实现...

只好先用C写着玩玩,做题还能用上...网原要考的...

例题:要发送的数据为1101011011,CRC生成多项式P(X)=X4+X+1,求应添加在数据后面的余数。

笔算过程:

编程算:

附上小白的代码...

 1 #include "stdafx.h"
 2 #define DATABIT_LENGTH 10             //数据位数
 3 #define GENERATOR_LENGTH 5            //生成多项式位数
 4 #define DATACRC_LENGTH DATABIT_LENGTH+GENERATOR_LENGTH-1
 5
 6 int main()
 7 {
 8     int dataBit[DATABIT_LENGTH];        //数据
 9     int crcBit[GENERATOR_LENGTH - 1];   //余数
10     for (int i = 0; i < GENERATOR_LENGTH - 1; i++)      //余数初始化为0
11     {
12         crcBit[i] = 0;
13     }
14     int generator[GENERATOR_LENGTH] = {1,0,0,0,1};        //初始化生成多项式
15     printf("输入生成多项式:");
16     for (int i = 0; i < GENERATOR_LENGTH; i++)
17     {
18         scanf("%d", &generator[i]);
19     }
20     for (int i = 0; i < DATABIT_LENGTH; i++)           //初始化要传送的数据
21     {
22         dataBit[i] = 0;
23     }
24     printf("输入数据计算校验位:");
25     for (int i = 0; i < DATABIT_LENGTH; i++)
26     {
27         scanf("%d",&dataBit[i]);
28     }
29     int datacrc[DATACRC_LENGTH];                  //数据后面补0
30     for (int i = 0; i < DATACRC_LENGTH; i++)
31     {
32         if (i < DATABIT_LENGTH)
33         {
34             datacrc[i] = dataBit[i];
35         }
36         else
37             datacrc[i] = 0;
38     }
39     int crctmp[GENERATOR_LENGTH];               //模2运算过程中的“被减数”,“减数”是生成多项式
40     for (int i = 0; i < GENERATOR_LENGTH; i++)
41     {
42         crctmp[i] = -1;                         //被减数最开始让每一位都是-1
43     }
44     int p = 0;
45     for (int i = p; i < DATACRC_LENGTH; i++)
46     {
47         if (crctmp[0] == -1)
48         {
49             for (int k = 0; k < GENERATOR_LENGTH - 1; k++)
50             {
51                 crctmp[k] = crctmp[k + 1];               //如果被减数第一位是-1的话,就左移一位,右边空出一位。
52             }
53             crctmp[GENERATOR_LENGTH - 1] = datacrc[i];   //空出的一位从上面读一个数下来
54         }
55         if(crctmp[0] != -1)                              //啥时候第一位不是-1了
56         {
57         //    printf("读到");
58             for (int j = 0; j < GENERATOR_LENGTH; j++)    //证明读到一个长度和生成多项式一样长的数了,可以做模2运算了。
59             {
60                 printf("%d ", crctmp[j]);                 //输出被减数
61             }
62             printf("\n");
63             for (int j = 0; j < GENERATOR_LENGTH; j++)
64             {
65                 printf("%d ", generator[j]);              //输出减数
66             }
67             printf("\n");
68             printf("\n");
69         //    printf("算\n");
70             for (int j = 0; j < GENERATOR_LENGTH; j++)
71             {
72                 crctmp[j] = crctmp[j] ^ generator[j];      //按位异或得到结果
73             }
74             for (int j = 0; j < GENERATOR_LENGTH;j++)
75             {
76                 if (crctmp[j] == 1)
77                     break;
78                 crctmp[j] = -1;                           //把上面的结果前面几个0换成-1,循环回去继续读数。
79             }
80         }
81         //for (int j = 0; j < GENERATOR_LENGTH; j++)
82         //{
83         //        printf("%d ", crctmp[j]);
84         //}
85         //printf("\n");
86     }
87     for (int i = 1; i < GENERATOR_LENGTH; i++)
88     {
89         if (crctmp[i] != -1&&crctmp[i]!=0)              //被除数都落下来了后,得到余数,存到crcBit里。
90             crcBit[i-1] = 1;
91     }
92     printf("余数:");
93     for(int i = 0; i < GENERATOR_LENGTH-1; i++)
94     {
95         printf("%d", crcBit[i]);
96     }
97     getchar();getchar();
98     return 0;
99 }

C++可以用bitset类写,就不用整这些数组了...

时间: 2024-12-23 22:20:23

[C语言]模拟人工计算CRC校验码的相关文章

[技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

1.CRC.FCS是什么 CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据产生简短固定位数校验码的一种信道编码技术,主要用来检测或校验数据传输或者保存后可能出现的错误.它是利用除法及余数的原理来作错误侦测的. FCS,全称Frame Check Sequence,中文名称为帧校验序列,俗称帧尾,即计算机网络数据链路层的协议数据单元(帧)的尾部字段,是一段4个字节的循环冗余校验码. 注:CRC循环冗余校验和FCS帧校验序列是

Redis源码中的CRC校验码(crc16、crc64)原理浅析

在阅读Redis源码的时候,看到了两个文件:crc16.c.crc64.c.下面我抛砖引玉,简析一下原理. CRC即循环冗余校验码,是信息系统中一种常见的检错码.大学课程中的"计算机网络"."计算机组成"等课程中都有提及.我们可能都了解它的数学原理,在试卷上手工计算一个CRC校验码,并不是难事.但是计算机不是人,现实世界中的数学原理需要转化为计算机算法才能实现目的.实际上作为计算机专业背景人并不会经常使用或接触到CRC的计算机算法实现的原理,通常是电子学科背景的人士

CRC校验码原理、实例、手动计算

CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果为1,crc^crc_mul;同时,如果原本crc最高位是1,那么crc^crc_mul后左移1位,否则只是左移一位.计算完一个字符后,装入下一个字符. #include<stdio.h> #define crc_mul 0x1021 //生成多项式 unsigned int cal_crc(unsigned char *ptr, unsigned char len) { unsigned char i; unsigned

CRC校验码的verilog实现与仿真结果

循环冗余校验码(CRC)的基本原理是: 将被处理的报文比特序列当做一个二进制多项式A(x)的系数,(任意一个由二进制位串组成的代码都可以和一个系数仅为'0'和'1'取值的多项式一一对应.例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111),该系数乘以2^n(n为生成多项式g(x)中x的最高次幂)以后再除以发送方和接收方事先约定好的生成多项式g(x)后,求得的余数P(x)就是CRC校验码,把它副到原始的报文A(x)后面形成新的报

CRC校验码

下内容摘自笔者即将出版的最新著作<深入理解计算机网络>一书.本书将于12月底出版上市,敬请留意!! 本书原始目录参见此文:http://winda.blog.51cto.com/55153/1063878 5.3.2 循环冗余校验检错方案 上节介绍的奇偶校验码(PCC)只能校验一位错误,本节所要介绍的循环冗余校验码(CRC)的检错能力更强,可以检出多位错误. 1. CRC校验原理 CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的.其实很简单的问题,其根本

计算机网络——CRC校验码的简单测试

目录 循环冗余校验码 简单例子 程序代码 运行结果 循环冗余校验码 了解CRC校验 简单例子 实际的CRC校验码生成是采用二进制的模2算法(即减法不借位.加法不进位)计算出来的,这是一种异或操作.下面通过一些例子来进一步解释CRC的基本工作原理.假设: (1)设约定的生成多项式为G(x)=x4+x+1,其二进制表示为10011,共5位,其中k=4. (2)假设要发送数据序列的二进制为101011(即f(x)),共6位. (3)在要发送的数据后面加4个0(生成f(x)*xk),二进制表示为1010

Modbus协议 CRC 校验码

CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ----------------------------------------------------- 0x8005=1000 0000 0000 0101B  0xA001=1010 0000 0000 0001B 对比两个二进制高低位正好是完全相反的,CRC校验分为正向校验与反向校验.正向校验高位在左,反向校验低位在左 正向校验使用左

计算CRC校验值(CRC16和CRC32)(网络传输检验)

CRC有非常多的模式,我没有全部都做,目前支持 CRC16-Modbus CRC16-X25 CRC32 使用方法 auto data = QByteArray::fromHex( "01 02 03 04 05" ); auto crc16ForModbus = JQChecksum::crc16ForModbus( data ); auto crc16ForX25 = JQChecksum::crc16ForX25( data ); auto crc32 = JQChecksum:

计算身份证校验码(最后一位)

在线预览 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> #msg{ color: red; } </style> </head> <body> 身份证号:<input id="id-card