码迷,mamicode.com
首页 > 编程语言 > 详细

CRC循环冗余检测C语言实现----花了几天时间乱写的

时间:2019-12-01 20:53:44      阅读:90      评论:0      收藏:0      [点我收藏+]

标签:依次   string   getc   put   函数   ring   查看   temp   读一行   

由于笔者目前正在上计算机网络的课,老师要我们编一下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 = 0;//定义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=1;
    for (int i = 1; i <= b;i++) {
        SUM= a * SUM;
    }
    return SUM;
}
//定义输入函数
int input() {
    printf("请输入一组数据:");
    //这里使用gets才可以计算空格的字符串长度,使用scanf的话,遇到空格就结束了,而gets一次读一行。确保使用strlen时计算正确
    gets(data);
    for (i = 0; i < 50; i++)
    {//因为ASCII码就是以10进制的方式表示的,所以直接赋值给整型数组
        data_10[i] = data[i];
    }
    //获取字符数组里面的存储长度,赋值给strLength
    strLength = strlen(data);
    printf("字符串的长度为:%d\n", strLength);
    printf("您输入的字符对应的ASCII码为:");
    for (i = 0; i < strLength; i++) {
        printf("%d,", data_10[i]);
        //将字符数组存储到整型数组里面,再逐个输出
        sum_10 = sum_10 + data_10[i];
    }
    
    return 1;
}
//定义十进制转二进制的函数
void change_two() {
    x = sum_10;
    n = 2;
    int data_2_zhenxu[50];
    for (i = 0; i < 50; i++)
    {
        data_2[i] = 0;//初始化数据data,使其全部为0
    }

    printf("\AsCII码总和为:%d,对应的%d进制为:", x, n); // n=2,表示二进制
    while (x > 0)
    {
        data_2[index] = x % n;
        x = x / n;
        index++;
    }
    int Index = index;
        for (i = 0; i <= Index - 1; i++) {
            data_2_zhenxu[i] = data_2[index-1];
            index--;
        }
        for (i = 0; i <=Index - 1; i++) {
            data_2[i] = data_2_zhenxu[i];
        }
        for (i = 0; i <= Index - 1; i++) {
            redata_2[i] = data_2_zhenxu[i];
        }
        for (i = 0; i <=Index - 1; 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[max];
    printf("请输入除数的二进制数个数(请观察数据的二进制长度,必须长度小于数据的长度):");
    scanf("%d", &z);
    tempdata = (int*)malloc(sizeof(int)*z);
    getchar();
    for (i = 0; i < z; i++) {
        printf("\n请输入第%d个数字:", i + 1);
        scanf("%d", &tempdata[i]);
        getchar();
    }
    printf("您输入的二进制为:");
    for (i = 0; i < z; i++) {
        printf("%d", tempdata[i]);
    }
    for (int i = 0; i <z; i++) {
        data_2_del[i] = tempdata[i];
    }
    strLength_del = z;
    for (i = strLength_2; i < (strLength_2 + z-1); i++) {
        data_2[i] = 0;
    }
    int hmy = (strLength_2 + z );
    printf("\n重新生成后的数据为:");
    for (i = 0; i < (strLength_2 + z - 1); i++) {
        printf("%d", data_2[i]);
    }
    printf("\n除数二进制位长度:%d\n", strLength_del);
    printf("除数二进制位:");
    for (int i = 0; i < strLength_del; i++) { printf(":%d", data_2_del[i]); }
    for (int i = 0; i < strLength_del; i++) { tempArry[i] = 0; }
    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 = 0;//定义数据前几位拼成的整型数据大小;
            int del_Sum = 0;//定义除数前几位拼成的整型数据大小
            //每次进行模2运算前,都要比较前几位拼成的整数大小
            for (int j = 0; j < strLength_del; j++) {
                strLength_del2--;
                dataSum += data_2[j] * pow(10, strLength_del2);
                del_Sum += data_2_del[j] * pow(10, 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 >= 0) {
                    int count = 0;
                    for (; count < strLength_del; count++) {
                        if (data_2[count] == data_2_del[count]) {
                            data_2[count] = 0; 
                            if ((count+1) % strLength_del == 0) {
                                for (int i = 0; i < Max - 1; i++) {
                                    data_2[i] = data_2[i + 1];//数组数据前移
                                }
                                Max--;
                                hmy--;//数据实际长度-1
                                printf("测试\n"); 
                            }
                        }
                        else {
                            data_2[count] = 1;
                            if ((count + 1) % strLength_del == 0) {
                                for (int i = 0; i < Max - 1; i++) {
                                    data_2[i] = data_2[i + 1];
                                }
                                Max--;
                                hmy--;//数据实际长度-1
                                printf("测试\n");
                            }

                        }
                    }//
                }
                else {
                    /*printf("datasum<del_sum;");*/
                    int count = 0;
                    for (; count < strLength_del; count++) {
                        if (tempArry[count] == data_2_del[count]) {
                            data_2[count] = 0;
                            if ((count + 1) % strLength_del == 0) {
                                for (int i = 0; i < Max - 1; i++) {
                                    data_2[i] = data_2[i + 1];//数组数据前移
                                }
                                Max--;
                                hmy--;//数据实际长度-1
                                printf("测试\n"); 
                            }
                        }
                        else {
                            data_2[count] = 1;
                            if ((count + 1) % strLength_del == 0) {
                                for (int i = 0; i < Max - 1; i++) {
                                    data_2[i] = data_2[i + 1];
                                }
                                Max--;
                                hmy--;//数据实际长度-1
                                printf("测试\n");
                            }

                        }
                    }//
                }
            

        }
//输出余数二进制
        for (int i = 0; i < max; i++) {
            data_2_yushu[i] = data_2[i];
        }
        printf("余数二进制为:");
        for(i=0;i< strLength_del-1;i++)
        printf("%d", data_2_yushu[i]);
    }
    int j;
    int HMY = restrLength_2 + z;
    for (i = (restrLength_2),j=0; i < (restrLength_2+z-1);j++, i++) {
        redata_2[i] = data_2_yushu[j];
    }
    printf("拼上余数后的数据为:");
    for (i = 0; i < (restrLength_2+z-1); i++) {
        printf("%d",redata_2[i]);
    }
    printf("\n除数二进制位:");
    for (int i = 0; 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 = 0;//定义数据前几位拼成的整型数据大小;
        int del_Sum = 0;//定义除数前几位拼成的整型数据大小
        //每次进行模2运算前,都要比较前几位拼成的整数大小
        for (int j = 0; j < strLength_del; j++) {
            strLength_del2--;
            dataSum += redata_2[j] * pow(10, strLength_del2);
            del_Sum += data_2_del[j] * pow(10, 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 >= 0) {
            int count = 0;
            for (; count < strLength_del; count++) {
                if (redata_2[count] == data_2_del[count]) {
                    redata_2[count] = 0;
                    if ((count + 1) % strLength_del == 0) {
                        for (int i = 0; i < Max - 1; i++) {
                            redata_2[i] = redata_2[i + 1];//数组数据前移
                        }
                        Max--;
                        HMY--;//数据实际长度-1
                        printf("测试\n");
                    }
                }
                else {
                    data_2[count] = 1;
                    if ((count + 1) % strLength_del == 0) {
                        for (int i = 0; i < Max - 1; i++) {
                            redata_2[i] = redata_2[i + 1];
                        }
                        Max--;
                        HMY--;//数据实际长度-1
                        printf("测试\n");
                    }

                }
            }//
        }
        else {
            /*printf("datasum<del_sum;");*/
            int count = 0;
            for (; count < strLength_del; count++) {
                if (tempArry[count] == data_2_del[count]) {
                    redata_2[count] = 0;
                    if ((count + 1) % strLength_del == 0) {
                        for (int i = 0; i < Max - 1; i++) {
                            redata_2[i] = redata_2[i + 1];//数组数据前移
                        }
                        Max--;
                        HMY--;//数据实际长度-1
                        printf("测试\n");
                    }
                }
                else {
                    redata_2[count] = 1;
                    if ((count + 1) % strLength_del == 0) {
                        for (int i = 0; i < Max - 1; i++) {
                            redata_2[i] = redata_2[i + 1];
                        }
                        Max--;
                        HMY--;//数据实际长度-1
                        printf("测试\n");
                    }

                }
            }//
        }
    }
    int crcSum = 0;
    printf("检测后的数据为:");
    for (i = 0; i < max; i++) {
        printf("%d", redata_2[i]);
        crcSum += redata_2[i];
    }
    if (crcSum==0) {
        printf("\n");
        printf("\nCRC检测无误!><!!!!!!!!!");
    }
}

 

CRC循环冗余检测C语言实现----花了几天时间乱写的

标签:依次   string   getc   put   函数   ring   查看   temp   读一行   

原文地址:https://www.cnblogs.com/hmy-666/p/11967236.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!