由于笔者目前正在上计算机网络的课,老师要我们编一下crc的循环检测过程,所以我想着刚好在学c,那就随便看看写不写的了,首先百度了一下网上资料,基本都是用位移运算符实现的,由于本人懒得去看一下位移运算,就用数组存储1,0,凑合一下,采用元素整体往前移1位的思想,看看能不能实现,最后似乎是写出来了,但是写的很杂乱。别人用几十行写的,用了位移运算符,我没用,而是用其它方式实现,写了几百行,虽然说几百行,里面的代码复用率也很高了,没有去封装成一个函数来调用是本次实验的一大不足。现在就在此记录一下我的浅陋的代码,供我以后查看。

如被各位前辈看到,就当没看见吧,因为实在惨不忍睹……

#include "stdio.h"
#include <string.h> #define max 50
char data[max];
int data_10[max];//定义是数据的10进制数组
int data_2[max];//定义数据的2进制数组
int redata_2[max];//定义加上余数的数据的2进制数组
int data_2_del[max];//定义保存除数的2进制数组
int data_2_yushu[max];//定义保存余数的2进制数组
int i, sum_10;//sum_10是10进制数组里面各个数字的和
int strLength;//定义数据长度
int strLength_2;//定义数据二进制长度
int restrLength_2;//定义拼接余数的数据二进制长度
int strLength_del;//定义除数二进制长度
int x, n, index = ;//定义x,用来接收十进制和sum_10 int pow(int a, int b);//定义乘方函数
int input();//定义输入函数
void change_two();//定义转二进制函数
void div_2();//定义模2运算 int main()
{ input();//输入函数
change_two();//数据转二进制
div_2();
}
//乘方函数
int pow(int a, int b) {
int SUM=;
for (int i = ; i <= b;i++) {
SUM= a * SUM;
}
return SUM;
}
//定义输入函数
int input() {
printf("请输入一组数据:");
//这里使用gets才可以计算空格的字符串长度,使用scanf的话,遇到空格就结束了,而gets一次读一行。确保使用strlen时计算正确
gets(data);
for (i = ; i < ; i++)
{//因为ASCII码就是以10进制的方式表示的,所以直接赋值给整型数组
data_10[i] = data[i];
}
//获取字符数组里面的存储长度,赋值给strLength
strLength = strlen(data);
printf("字符串的长度为:%d\n", strLength);
printf("您输入的字符对应的ASCII码为:");
for (i = ; i < strLength; i++) {
printf("%d,", data_10[i]);
//将字符数组存储到整型数组里面,再逐个输出
sum_10 = sum_10 + data_10[i];
} return ;
}
//定义十进制转二进制的函数
void change_two() {
x = sum_10;
n = ;
int data_2_zhenxu[];
for (i = ; i < ; i++)
{
data_2[i] = ;//初始化数据data,使其全部为0
} printf("\AsCII码总和为:%d,对应的%d进制为:", x, n); // n=2,表示二进制
while (x > )
{
data_2[index] = x % n;
x = x / n;
index++;
}
int Index = index;
for (i = ; i <= Index - ; i++) {
data_2_zhenxu[i] = data_2[index-];
index--;
}
for (i = ; i <=Index - ; i++) {
data_2[i] = data_2_zhenxu[i];
}
for (i = ; i <= Index - ; i++) {
redata_2[i] = data_2_zhenxu[i];
}
for (i = ; i <=Index - ; i++)
printf("%d", data_2[i]);
strLength_2 = Index;
printf("\n");
}
//模2运算,采用数组方式存储1,0数字
/*1.进行模二运算前,先比较除数长度,必须小于输入的数据长度才可以运算
*2.每次运算数据的二进制长度都-1,然后依次比较数组的第一位到第strLength_del位,strLength_del是除数的二进制个数
*3.输出计算后的余数,再拼接到原数据上
*4.用拼接后的数据的二进制数再次于除数做模二运算,若余数为0,输出数据结果正确
*/
void div_2() {
/*for (i = index - 1; i >= 0; i--)
printf("%d", data_2[i]);*/
restrLength_2 = strLength_2;
int Max = max;//把50赋值给Max
int z;
int *tempdata;//为什么定义整型指针来实现整型数组
int *tempArry;
printf("请输入除数的二进制数个数(请观察数据的二进制长度,必须长度小于数据的长度):");
scanf("%d", &z);
tempdata = (int*)malloc(sizeof(int)*z);
tempArry = (int*)malloc(sizeof(int)*z);
getchar();
for (i = ; i < z; i++) {
tempArry[i] = ;
}
for (i = ; i < z; i++) {
printf("\n请输入第%d个数字:", i + );
scanf("%d", &tempdata[i]);
getchar();
}
printf("您输入的二进制为:");
for (i = ; i < z; i++) {
printf("%d", tempdata[i]);
}
for (int i = ; i <z; i++) {
data_2_del[i] = tempdata[i];
}
strLength_del = z;
for (i = strLength_2; i < (strLength_2 + z-); i++) {
data_2[i] = ;
}
int hmy = (strLength_2 + z );
printf("\n重新生成后的数据为:");
for (i = ; i < (strLength_2 + z - ); i++) {
printf("%d", data_2[i]);
}
printf("\n除数二进制位长度:%d\n", strLength_del);
printf("除数二进制位:");
for (int i = ; i < strLength_del; i++) { printf(":%d", data_2_del[i]); }
for (int i = ; i < strLength_del; i++) { tempArry[i] = ; }
if (strLength_del > (strLength_2 + z )) {
printf("除数不合法,请重新输入!\n");
div_2();
}
else
{
printf("下面开始进行模二运算!\n");
printf("----------------------------------------------\n");
while (hmy >=strLength_del) {
int strLength_del2 = strLength_del ;
int dataSum = ;//定义数据前几位拼成的整型数据大小;
int del_Sum = ;//定义除数前几位拼成的整型数据大小
//每次进行模2运算前,都要比较前几位拼成的整数大小
for (int j = ; j <; j++) {
strLength_del2--;
dataSum += data_2[j] * pow(, strLength_del2);
del_Sum += data_2_del[j] * pow(, strLength_del2);
printf("strLength_del2=%d\n", strLength_del2);
printf("datasum=%d,delsum=%d\n", dataSum, del_Sum);
}
/*printf("datasum=%d,delsum=%d", dataSum, del_Sum);*/
if (dataSum = del_Sum) {
int count = ;
for (; count < strLength_del; count++) {
if (data_2[count] == data_2_del[count]) {
data_2[count] = ;
if ((count+) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
data_2[i] = data_2[i + ];//数组数据前移
}
Max--;
hmy--;//数据实际长度-1
printf("测试\n");
}
}
else {
data_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
data_2[i] = data_2[i + ];
}
Max--;
hmy--;//数据实际长度-1
printf("测试\n");
} }
}//
}
else {
/*printf("datasum<del_sum;");*/
int count = ;
for (; count < strLength_del; count++) {
if (tempArry[count] == data_2_del[count]) {
data_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
data_2[i] = data_2[i + ];//数组数据前移
}
Max--;
hmy--;//数据实际长度-1
printf("测试\n");
}
}
else {
data_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
data_2[i] = data_2[i + ];
}
Max--;
hmy--;//数据实际长度-1
printf("测试\n");
} }
}//
} }
//输出余数二进制
for (int i = ; i < max; i++) {
data_2_yushu[i] = data_2[i];
}
printf("\n余数二进制为:");
for(i=;i< strLength_del-;i++)
printf("%d", data_2_yushu[i]);
}
int j;
int HMY = restrLength_2 + z;
for (i = (restrLength_2),j=; i < (restrLength_2+z-);j++, i++) {
redata_2[i] = data_2_yushu[j];
}
printf("\n拼上余数后的数据为:");
for (i = ; i < (restrLength_2+z-); i++) {
printf("%d",redata_2[i]);
}
printf("\n除数二进制位:");
for (int i = ; i < strLength_del; i++) { printf(":%d", data_2_del[i]); }
printf("\n下面进行循环冗余检测:\n");
printf("***************************************************\n");
while (HMY>= strLength_del) {
int strLength_del2 = strLength_del;
int dataSum = ;//定义数据前几位拼成的整型数据大小;
int del_Sum = ;//定义除数前几位拼成的整型数据大小
//每次进行模2运算前,都要比较前几位拼成的整数大小
//这里不用比较大小,比较看看有没有相同位数就好
for (int j = ; j <; j++) {
strLength_del2--;
dataSum += redata_2[j] * pow(, strLength_del2);
del_Sum += data_2_del[j] * pow(, strLength_del2);
printf("strLength_del2=%d\n", strLength_del2);
printf("datasum=%d,delsum=%d\n", dataSum, del_Sum);
}
/*printf("datasum=%d,delsum=%d", dataSum, del_Sum);*/
if (dataSum = del_Sum) {
int count = ;
for (; count < strLength_del; count++) {
if (redata_2[count] == data_2_del[count]) {
redata_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
redata_2[i] = redata_2[i + ];//数组数据前移
}
Max--;
HMY--;//数据实际长度-1
printf("测试\n");
}
}
else {
data_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
redata_2[i] = redata_2[i + ];
}
Max--;
HMY--;//数据实际长度-1
printf("测试\n");
} }
}//
}
else {
/*printf("datasum<del_sum;");*/
int count = ;
for (; count < strLength_del; count++) {
if (tempArry[count] == data_2_del[count]) {
redata_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
redata_2[i] = redata_2[i + ];//数组数据前移
}
Max--;
HMY--;//数据实际长度-1
printf("测试\n");
}
}
else {
redata_2[count] = ;
if ((count + ) % strLength_del == ) {
for (int i = ; i < Max - ; i++) {
redata_2[i] = redata_2[i + ];
}
Max--;
HMY--;//数据实际长度-1
printf("测试\n");
} }
}//
}
}
int crcSum = ;
printf("检测后的数据为:");
for (i = ; i < max; i++) {
printf("%d", redata_2[i]);
crcSum += redata_2[i];
}
if (crcSum==) {
printf("\n");
printf("\nCRC检测无误!><!!!!!!!!!");
}
}

最新文章

  1. Struts2登录小例子
  2. [Phalcon] Phalcon系统默认事件列表
  3. Remap BMW F11 2010 all ECUs with E-Sys and ENET cable
  4. Python字符串原理剖析------万恶的+号
  5. android4.0蓝牙使能的详细解析 (转载)
  6. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
  7. Ubuntu热键控制spotify播放和音量调节
  8. 【codevs 1911 孤岛营救问题】
  9. 中文字体名称对照表(unicode码)及20个web安全字体
  10. mysql中explain的type的解释
  11. Head First Python-Python简单处理文件
  12. 17款提高编码效率的CSS工具
  13. 安利一波:Adobe 2019全家桶 破解版
  14. Eclipse使用总结(不定时更新)
  15. object对象转string字符串
  16. 浏览器对CSS小数点的解析——坑
  17. &lt;第一次买基金就赚钱&gt;读书笔记
  18. Storm 系列(二)实时平台介绍
  19. SourceTree免密克隆仓库及问题说明
  20. Nginx配置里的fastcgi_index和index

热门文章

  1. JVM探秘:内存分配与回收策略
  2. 程序员初学者参考 ---懂得基础语法后如何做一个自己的case?
  3. Redis实战 | 持久化、主从复制特性和故障处理思路
  4. 性能数据的准备-Jmeter
  5. 有关字符串的算法(KMP,Manacher,BM)陆续补充
  6. 图解kubernetes调度器SchedulerCache核心源码实现
  7. 位运算上的小技巧 - AtCoder
  8. 【笔记】java并发编程实战
  9. Python语言的configparser模块便捷的读取配置文件内容
  10. 阿望教你用vue写扫雷(超详细哦)