绿豆荚子 2015-07-13 08:13 采纳率: 0%
浏览 1753
已结题

CRC-32校验通信软件设计

环境要求:Windows;信息交换内容为文本文件;WinSock通信
编码要求:用模2除法计算CRC码,生成多项式为CRC-32
功能要求:能在两台计算机机上运行程序,一台产生CRC码,另一台校验。
我已经有生成CRC码的程序了,但是不知道怎么可以实现WinSock通信,一定要满足WinSock通信的要求,最好是C语言的,要是别的能成功也行。
跪求大神帮帮忙,我把资料都发过去,一直在线等!!
1.发送端电脑A源程序:

 #include <stdio.h>
#include <stdlib.h>

__int64 crc;  //定义全局变量crc
__int64 create(__int64 data,__int64 POLY,int crcbitnumber) //生成crc码子函数
{
__int64 regi = 0x0; // 使寄存器为0
__int64 data_temp;
data_temp=data;
int databitnumber=32;  //定义数据位数,即输入的十六进制数最多8位
data<<= crcbitnumber; //data左移32位即在数据位后添加32个0
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )       //处理64 次(32 比特待测数据+32 比特扩展0),前32次是加载32比特待测数据,后32次是加载一比特扩展0
{
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 ) regi = regi ^ POLY;
    regi <<= 1;
unsigned short tmp = ( data >> cur_bit ) & 0x0001; //加载待测数据1比特到tmp中,tmp只有1比特
    regi |= tmp; //这1比特加载到寄存器中
}

if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
  regi = regi ^ POLY; //做最后一次XOR
printf("\t\t\tcrc=%x\n",regi);
crc=regi;
data_temp<<=32;
data_temp=data_temp+regi;
return data_temp;
}

void main()
{
FILE*lp_code,*lp_crc;//定义文件指针
__int64 code;//code即为实际传输的数据
__int64 data;//data为从键盘输入的数据即要传输的数据
__int64 POLY= (__int64)0x254028D1*0x7   ;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验发送端 **************\n\n");
printf("\t\t\t请输入需要传输的数据:");
scanf("%I64x",&data);   //%x,输入16进制整数
code=create(data,POLY,crcbitnumber);
printf("\t\t\tCODE=%I64x\n\n",code);
lp_code=fopen("D:\\tongxinwang\\code.txt","w");  //建立文件,以写入方式打开
lp_crc = fopen("D:\\tongxinwang\\crc.txt","w");
 fprintf(lp_code,"%I64x",code);
 fprintf(lp_crc,"%I64x",crc);
getchar();
fclose(lp_code);
fclose(lp_crc);
}

2.接收端电脑B源程序:

 #include <stdio.h>
#include <stdlib.h>

__int64 exam(__int64 data,__int64 POLY,int crcbitnumber) 
{
__int64 regi = 0x0;
__int64 data_temp;
data_temp=data;
int databitnumber=32;
for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )
{
  if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
      regi = regi ^ POLY;
  regi <<= 1;
  unsigned short tmp = ( data >> cur_bit ) & 0x0001;
  regi |= tmp; 
}
if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
  regi = regi ^ POLY; 
return(regi);
}

void main()
{FILE* lp_code;
__int64 code;
__int64 result;
__int64 POLY=(__int64) 0x254028D1*0x7;
int crcbitnumber=32;
printf("\n\t\t************** CRC校验接收端 **************\n\n");
 lp_code=fopen("\\\\192.168.0.27\\tongxinwang\\code.txt","r"); 
fscanf(lp_code,"%I64x\n",&code);
printf("\t\t\tcode=%I64x\n\n",code);
fclose(lp_code);
result=exam(code,POLY,crcbitnumber);
printf("\t\t\tresult=%I64x,",result);
if (result==0)
{printf("数据传输正确!\n\n");
code>>=32;
printf("\t\t\t去除CRC校验码后数据是%I64x。\n\n",code);
}
else printf("\n\t\t\t数据传输失败。");
}
  • 写回答

2条回答 默认 最新

  • 绿豆荚子 2015-07-13 08:19
    关注

    1.发送端电脑A源程序:
    #include
    #include

    int64 crc; //定义全局变量crc
    __int64 create(
    int64 data,__int64 POLY,int crcbitnumber) //生成crc码子函数
    {
    __int64 regi = 0x0; // 使寄存器为0
    __int64 data_temp;
    data_temp=data;
    int databitnumber=32; //定义数据位数,即输入的十六进制数最多8位
    data<<= crcbitnumber; //data左移32位即在数据位后添加32个0
    for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit ) //处理64 次(32 比特待测数据+32 比特扩展0),前32次是加载32比特待测数据,后32次是加载一比特扩展0
    {
    if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 ) regi = regi ^ POLY;
    regi <<= 1;
    unsigned short tmp = ( data >> cur_bit ) & 0x0001; //加载待测数据1比特到tmp中,tmp只有1比特
    regi |= tmp; //这1比特加载到寄存器中
    }

    if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
    regi = regi ^ POLY; //做最后一次XOR
    printf("\t\t\tcrc=%x\n",regi);
    crc=regi;
    data_temp<<=32;
    data_temp=data_temp+regi;
    return data_temp;
    }

    void main()
    {
    FILE*lp_code,*lp_crc;//定义文件指针
    int64 code;//code即为实际传输的数据
    __int64 data;//data为从键盘输入的数据即要传输的数据
    __int64 POLY= (
    int64)0x254028D1*0x7 ;
    int crcbitnumber=32;
    printf("\n\t\t************** CRC校验发送端 **************\n\n");
    printf("\t\t\t请输入需要传输的数据:");
    scanf("%I64x",&data); //%x,输入16进制整数
    code=create(data,POLY,crcbitnumber);
    printf("\t\t\tCODE=%I64x\n\n",code);
    lp_code=fopen("D:\tongxinwang\code.txt","w"); //建立文件,以写入方式打开
    lp_crc = fopen("D:\tongxinwang\crc.txt","w");
    fprintf(lp_code,"%I64x",code);
    fprintf(lp_crc,"%I64x",crc);
    getchar();
    fclose(lp_code);
    fclose(lp_crc);
    }

    2.接收端电脑B源程序:
    #include
    #include

    int64 exam(int64 data,__int64 POLY,int crcbitnumber)
    {
    __int64 regi = 0x0;
    __int64 data_temp;
    data_temp=data;
    int databitnumber=32;
    for ( int cur_bit = databitnumber+crcbitnumber-1; cur_bit >= 0; -- cur_bit )
    {
    if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
    regi = regi ^ POLY;
    regi <<= 1;
    unsigned short tmp = ( data >> cur_bit ) & 0x0001;
    regi |= tmp;
    }
    if ( ( ( regi >> crcbitnumber ) & 0x0001 ) == 0x1 )
    regi = regi ^ POLY;
    return(regi);
    }

    void main()
    {FILE* lp_code;
    int64 code;
    __int64 result;
    __int64 POLY=(
    int64) 0x254028D1*0x7;
    int crcbitnumber=32;
    printf("\n\t\t************** CRC校验接收端 **************\n\n");
    lp_code=fopen("\\192.168.0.27\tongxinwang\code.txt","r");
    fscanf(lp_code,"%I64x\n",&code);
    printf("\t\t\tcode=%I64x\n\n",code);
    fclose(lp_code);
    result=exam(code,POLY,crcbitnumber);
    printf("\t\t\tresult=%I64x,",result);
    if (result==0)
    {printf("数据传输正确!\n\n");
    code>>=32;
    printf("\t\t\t去除CRC校验码后数据是%I64x。\n\n",code);
    }
    else printf("\n\t\t\t数据传输失败。");
    }

    以上是采用文件共享形式的代码,就是在D盘建了一个文件夹,属性设置为共享了,能通过网络访问。怎么改成用Winsock通信呢??
    我是新人,不知道这样格式对不对

    评论

报告相同问题?

悬赏问题

  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法
  • ¥15 很想要一个很好的答案或提示