C#做以太网帧解析模拟小程序 用C#怎么做以太网帧结构的封装和解析程序,就是个简单的模拟啦... 大家帮忙... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找本TCPIP详解看看然后逐层封装帧结构就行了仔细点 不难 网上倒是有很多c++的,我想改成C#的,但是改了好久,错误百出...#include<iostream.h>#include<stdio.h>#include<conio.h>#include<io.h>#include<string.h>#define BUFFER_MAX 1500#define BUFFER_MIN 46char preamble[8];//前导码char addr_dest[6];//目的地址char addr_source[6];//源地址unsigned char length_data[2];//长度字段unsigned char fcs;//校验序列char frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节char input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"char writefilename[10];//文件名字FILE *fp;bool loop;//循环控制变量void framer(char *filename);//封装函数void jiexi(char *filename);//解析函数unsigned char GetFirstBit(unsigned char& a);void CRC(unsigned char ch,unsigned char &crc);void main(int argc,char *argv[])//主函数{ if(argc!=3)//命令格式不正确时,出现帮助信息 { printf("command format error!\n"); printf("command foramt:\n"); printf("\n-p 帧封装 : 可执行文件名 -p 数据帧文件名"); printf("\n-u 帧解析 : 可执行文件 -u 数据帧文件名"); printf("\n"); } else { strcpy(writefilename,argv[2]); if(!strcmp(argv[1],"-p")) { framer(writefilename); } if(!strcmp(argv[1],"-u")) { jiexi(writefilename); } getch(); }}void jiexi(char *filename)//解析函数{ unsigned char ch; int j;//循环变量 int data_length; int count=0; int number=0; unsigned char crctemp; if((fp=fopen(filename,"rb"))==NULL) { printf("Failed to open the file!"); return; } while(!feof(fp)) { data_length=0; crctemp=0; ch=fgetc(fp); //printf("%x",ch); if(ch==0xAA)count++;//count标记前导符的个数; else { count=0; continue; } if(count==7)//找到七个字节连续的前导码 { count=0; ch=fgetc(fp); if(ch==0xAB)//找到帧定界符,开始解析帧 { number++;//标记帧的个数; for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址 for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址 length_data[0]=fgetc(fp);//读入长度字段 length_data[1]=fgetc(fp); for(j=0;j<6;j++) { CRC(addr_dest[j],crctemp);//目的地址检验 } for(j=0;j<6;j++) { CRC(addr_source[j],crctemp);//源地址检验 } for(j=0;j<2;j++) { CRC(length_data[j],crctemp);//长度字段检验 } data_length = length_data[0]*256+length_data[1];//计算数据部分长度 for(j=0;j<data_length;j++) { ch=fgetc(fp); input[j]=ch; CRC(ch,crctemp);//数据字段检验 } if(data_length<46) { for(j=0;j<46-data_length;j++) { ch=fgetc(fp); CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验 } } ch=fgetc(fp); fcs=ch; CRC(0,crctemp);//最后8bit零检验 //printf("FCS : %x",fcs); //printf("tempcrc : %x",crctemp); if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出 { printf("\n\n=======================Number%d- frame==========================",number); printf("\n Sequence:%d",number); printf("\n Front code:"); for(j=0;j<7;j++) { printf("AA"); } printf("\n Bound flag: AB"); printf("\n Detination address:"); for(j=0;j<6;j++) { printf("-%x",addr_dest[j]); } printf("\n Source address:"); for(j=0;j<6;j++) { printf("-%x",addr_source[j]); } printf("\n Length :"); for(j=0;j<2;j++) { printf("%x",length_data[j]); } printf("\nThe data: "); for(j=0;j<data_length;j++) { printf("%c",input[j]); } printf("\nCRC CHECK (right):%x",fcs); printf("\nStatus: Accept"); } else { printf(" \nFrame translation error! Frame number is %d",number); } } } } count=0; printf("\nThe task has already been finished!"); return;}void framer(char *filename)//封装函数{ char ch; loop = true; int j;//循环变量 int data_length ; if((fp = fopen(filename,"wb"))==NULL) { printf("Please input some information which we will write into the frame file:\n"); } while(loop) { data_length=0; for(j=0;j<7;j++) //写入前导码,帧前界定符;源地址;目的地址 { frame[j]=0xaa; } frame[7]=0xab; for(j=8;j<14;j++) { frame[j]=0xff; } frame[14]=0x00; frame[15]=0x16; frame[16]=0x76; frame[17]=0xb4; frame[18]=0xe4; frame[19]=0x77; scanf("%s",&input[0]); while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度 frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换 frame[21] = (unsigned char)(data_length&0xff); fcs=0; int frame_length=0; if(data_length>=BUFFER_MIN) { for(j = 0;j<data_length;j++) { frame[22+j] = input[j]; } for(j=8;j<22+data_length;j++) { CRC(frame[j],fcs); } CRC(0,fcs);//输入数据的最后补上8个bit零 frame_length=22+data_length+1; frame[frame_length-1]= fcs; } else { for(j=data_length;j<BUFFER_MIN;j++) { input[j]=0; } for(j = 0;j<BUFFER_MIN;j++) { frame[22+j] = input[j]; } for(j=8;j<22+BUFFER_MIN;j++) { CRC(frame[j],fcs); } CRC(0,fcs); //printf("CRC: %x",fcs); frame_length=22+46+1; frame[68]=fcs; //printf("CRC: %x",frame[68]); /*for(j=8;j<69;j++) { printf(" %x",frame[j]); }*/ } for(int f=0;f<frame_length;f++)//往文件中写入帧信息 { if(fwrite(&frame[f],sizeof(char),1,fp)!=1) { printf("File write error!"); fclose(fp); } } printf("Do you want to write the next frame?(y/n)"); cin>>ch; if(ch=='n'||ch=='N') { loop=false; } else { printf("\nPlease input some information which we will write into the frame file:\n"); continue; } } fclose(fp); printf("\nThe frame file has already been writed! It's been saved in %s file ",filename);}unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用 //调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们 //采用的crc校验是一位一位的校验;){ int temp; temp=a;temp=temp<<1; return (unsigned char)(temp>>8);}void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数{ int i; unsigned char data_input,crcfb; for(i=0;i<8;i++) { data_input=GetFirstBit(ch); ch=ch<<1; crcfb=GetFirstBit(crc); crc=crc<<1; crc=crc|data_input; if(crcfb==1) crc=crc^7; }}求大侠帮忙改成C#的,只要解析功能和CRC验证,谢啦啦啦啦... 上面的代码太乱了,帮忙改这个...#include<iostream.h>#include<stdio.h>#include<conio.h>#include<io.h>#include<string.h>#define BUFFER_MAX 1500#define BUFFER_MIN 46char preamble[8];//前导码char addr_dest[6];//目的地址char addr_source[6];//源地址unsigned char length_data[2];//长度字段unsigned char fcs;//校验序列char frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节char input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"char writefilename[10];//文件名字FILE *fp;bool loop;//循环控制变量void framer(char *filename);//封装函数void jiexi(char *filename);//解析函数unsigned char GetFirstBit(unsigned char& a);void CRC(unsigned char ch,unsigned char &crc);void main(int argc,char *argv[])//主函数{ if(argc!=3)//命令格式不正确时,出现帮助信息 { printf("command format error!\n"); printf("command foramt:\n"); printf("\n-p 帧封装 : 可执行文件名 -p 数据帧文件名"); printf("\n-u 帧解析 : 可执行文件 -u 数据帧文件名"); printf("\n"); } else { strcpy(writefilename,argv[2]); if(!strcmp(argv[1],"-p")) { framer(writefilename); } if(!strcmp(argv[1],"-u")) { jiexi(writefilename); } getch(); }}void jiexi(char *filename)//解析函数{ unsigned char ch; int j;//循环变量 int data_length; int count=0; int number=0; unsigned char crctemp; if((fp=fopen(filename,"rb"))==NULL) { printf("Failed to open the file!"); return; } while(!feof(fp)) { data_length=0; crctemp=0; ch=fgetc(fp); //printf("%x",ch); if(ch==0xAA)count++;//count标记前导符的个数; else { count=0; continue; } if(count==7)//找到七个字节连续的前导码 { count=0; ch=fgetc(fp); if(ch==0xAB)//找到帧定界符,开始解析帧 { number++;//标记帧的个数; for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址 for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址 length_data[0]=fgetc(fp);//读入长度字段 length_data[1]=fgetc(fp); for(j=0;j<6;j++) { CRC(addr_dest[j],crctemp);//目的地址检验 } for(j=0;j<6;j++) { CRC(addr_source[j],crctemp);//源地址检验 } for(j=0;j<2;j++) { CRC(length_data[j],crctemp);//长度字段检验 } data_length = length_data[0]*256+length_data[1];//计算数据部分长度 for(j=0;j<data_length;j++) { ch=fgetc(fp); input[j]=ch; CRC(ch,crctemp);//数据字段检验 } if(data_length<46) { for(j=0;j<46-data_length;j++) { ch=fgetc(fp); CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验 } } ch=fgetc(fp); fcs=ch; CRC(0,crctemp);//最后8bit零检验 //printf("FCS : %x",fcs); //printf("tempcrc : %x",crctemp); if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出 { printf("\n\n=======================Number%d- frame==========================",number); printf("\n Sequence:%d",number); printf("\n Front code:"); for(j=0;j<7;j++) { printf("AA"); } printf("\n Bound flag: AB"); printf("\n Detination address:"); for(j=0;j<6;j++) { printf("-%x",addr_dest[j]); } printf("\n Source address:"); for(j=0;j<6;j++) { printf("-%x",addr_source[j]); } printf("\n Length :"); for(j=0;j<2;j++) { printf("%x",length_data[j]); } printf("\nThe data: "); for(j=0;j<data_length;j++) { printf("%c",input[j]); } printf("\nCRC CHECK (right):%x",fcs); printf("\nStatus: Accept"); } else { printf(" \nFrame translation error! Frame number is %d",number); } } } } count=0; printf("\nThe task has already been finished!"); return;}void framer(char *filename)//封装函数{ char ch; loop = true; int j;//循环变量 int data_length ; if((fp = fopen(filename,"wb"))==NULL) { printf("Please input some information which we will write into the frame file:\n"); } while(loop) { data_length=0; for(j=0;j<7;j++) //写入前导码,帧前界定符;源地址;目的地址 { frame[j]=0xaa; } frame[7]=0xab; for(j=8;j<14;j++) { frame[j]=0xff; } frame[14]=0x00; frame[15]=0x16; frame[16]=0x76; frame[17]=0xb4; frame[18]=0xe4; frame[19]=0x77; scanf("%s",&input[0]); while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度 frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换 frame[21] = (unsigned char)(data_length&0xff); fcs=0; int frame_length=0; if(data_length>=BUFFER_MIN) { for(j = 0;j<data_length;j++) { frame[22+j] = input[j]; } for(j=8;j<22+data_length;j++) { CRC(frame[j],fcs); } CRC(0,fcs);//输入数据的最后补上8个bit零 frame_length=22+data_length+1; frame[frame_length-1]= fcs; } else { for(j=data_length;j<BUFFER_MIN;j++) { input[j]=0; } for(j = 0;j<BUFFER_MIN;j++) { frame[22+j] = input[j]; } for(j=8;j<22+BUFFER_MIN;j++) { CRC(frame[j],fcs); } CRC(0,fcs); //printf("CRC: %x",fcs); frame_length=22+46+1; frame[68]=fcs; //printf("CRC: %x",frame[68]); /*for(j=8;j<69;j++) { printf(" %x",frame[j]); }*/ } for(int f=0;f<frame_length;f++)//往文件中写入帧信息 { if(fwrite(&frame[f],sizeof(char),1,fp)!=1) { printf("File write error!"); fclose(fp); } } printf("Do you want to write the next frame?(y/n)"); cin>>ch; if(ch=='n'||ch=='N') { loop=false; } else { printf("\nPlease input some information which we will write into the frame file:\n"); continue; } } fclose(fp); printf("\nThe frame file has already been writed! It's been saved in %s file ",filename);}unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用 //调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们 //采用的crc校验是一位一位的校验;){ int temp; temp=a;temp=temp<<1; return (unsigned char)(temp>>8);}void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数{ int i; unsigned char data_input,crcfb; for(i=0;i<8;i++) { data_input=GetFirstBit(ch); ch=ch<<1; crcfb=GetFirstBit(crc); crc=crc<<1; crc=crc|data_input; if(crcfb==1) crc=crc^7; }} 看别人发了个DBHelper,我也发一个自己用的。 datagrid 绑定 xml (紧急问题) 如何重写treeView控件,添加RichTextBox 请问用c#如何得到一个excel档有几个sheet?和这些sheet的名称? StringBuilder生成HTML的问题 循环删除用户组件的问题 200分跪求,用C#编写COM或DCOM 急!!!!!关于Treeview的问题 如何制作一个永远走动,走完后自动重新开始的进度条? c# 获取CPU 内存使用量 \ CPU 主版温度 \ 当前主界面用户 100分在线等 winfrorm里面的 md5加密怎么写的 关于流
然后逐层封装帧结构就行了
仔细点 不难
#include<iostream.h>
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<string.h>
#define BUFFER_MAX 1500
#define BUFFER_MIN 46
char preamble[8];//前导码
char addr_dest[6];//目的地址
char addr_source[6];//源地址
unsigned char length_data[2];//长度字段
unsigned char fcs;//校验序列
char frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节
char input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"
char writefilename[10];//文件名字
FILE *fp;
bool loop;//循环控制变量
void framer(char *filename);//封装函数
void jiexi(char *filename);//解析函数
unsigned char GetFirstBit(unsigned char& a);
void CRC(unsigned char ch,unsigned char &crc);
void main(int argc,char *argv[])//主函数
{
if(argc!=3)//命令格式不正确时,出现帮助信息
{
printf("command format error!\n");
printf("command foramt:\n");
printf("\n-p 帧封装 : 可执行文件名 -p 数据帧文件名");
printf("\n-u 帧解析 : 可执行文件 -u 数据帧文件名");
printf("\n");
}
else
{
strcpy(writefilename,argv[2]);
if(!strcmp(argv[1],"-p"))
{
framer(writefilename);
}
if(!strcmp(argv[1],"-u"))
{
jiexi(writefilename);
}
getch();
}
}void jiexi(char *filename)//解析函数
{
unsigned char ch;
int j;//循环变量
int data_length;
int count=0;
int number=0;
unsigned char crctemp;
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Failed to open the file!");
return;
}
while(!feof(fp))
{
data_length=0;
crctemp=0;
ch=fgetc(fp);
//printf("%x",ch);
if(ch==0xAA)count++;//count标记前导符的个数;
else
{
count=0;
continue;
}
if(count==7)//找到七个字节连续的前导码
{
count=0;
ch=fgetc(fp);
if(ch==0xAB)//找到帧定界符,开始解析帧
{
number++;//标记帧的个数;
for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址
for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址
length_data[0]=fgetc(fp);//读入长度字段
length_data[1]=fgetc(fp);
for(j=0;j<6;j++)
{
CRC(addr_dest[j],crctemp);//目的地址检验
}
for(j=0;j<6;j++)
{
CRC(addr_source[j],crctemp);//源地址检验
}
for(j=0;j<2;j++)
{
CRC(length_data[j],crctemp);//长度字段检验
}
data_length = length_data[0]*256+length_data[1];//计算数据部分长度
for(j=0;j<data_length;j++)
{
ch=fgetc(fp);
input[j]=ch;
CRC(ch,crctemp);//数据字段检验
}
if(data_length<46)
{
for(j=0;j<46-data_length;j++)
{
ch=fgetc(fp);
CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验
}
}
ch=fgetc(fp);
fcs=ch;
CRC(0,crctemp);//最后8bit零检验
//printf("FCS : %x",fcs);
//printf("tempcrc : %x",crctemp);
if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出
{
printf("\n\n=======================Number%d- frame==========================",number);
printf("\n Sequence:%d",number);
printf("\n Front code:");
for(j=0;j<7;j++)
{
printf("AA");
}
printf("\n Bound flag: AB");
printf("\n Detination address:");
for(j=0;j<6;j++)
{
printf("-%x",addr_dest[j]);
}
printf("\n Source address:");
for(j=0;j<6;j++)
{
printf("-%x",addr_source[j]);
}
printf("\n Length :");
for(j=0;j<2;j++)
{
printf("%x",length_data[j]);
}
printf("\nThe data: ");
for(j=0;j<data_length;j++)
{
printf("%c",input[j]);
}
printf("\nCRC CHECK (right):%x",fcs);
printf("\nStatus: Accept");
}
else
{
printf(" \nFrame translation error! Frame number is %d",number);
}
}
}
}
count=0;
printf("\nThe task has already been finished!");
return;
}
void framer(char *filename)//封装函数
{
char ch;
loop = true;
int j;//循环变量
int data_length ;
if((fp = fopen(filename,"wb"))==NULL)
{
printf("Please input some information which we will write into the frame file:\n");
} while(loop)
{
data_length=0;
for(j=0;j<7;j++) //写入前导码,帧前界定符;源地址;目的地址
{
frame[j]=0xaa;
}
frame[7]=0xab;
for(j=8;j<14;j++)
{
frame[j]=0xff;
}
frame[14]=0x00;
frame[15]=0x16;
frame[16]=0x76;
frame[17]=0xb4;
frame[18]=0xe4;
frame[19]=0x77;
scanf("%s",&input[0]);
while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度
frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换
frame[21] = (unsigned char)(data_length&0xff);
fcs=0;
int frame_length=0;
if(data_length>=BUFFER_MIN)
{
for(j = 0;j<data_length;j++)
{
frame[22+j] = input[j];
}
for(j=8;j<22+data_length;j++)
{
CRC(frame[j],fcs);
}
CRC(0,fcs);//输入数据的最后补上8个bit零
frame_length=22+data_length+1;
frame[frame_length-1]= fcs;
}
else
{
for(j=data_length;j<BUFFER_MIN;j++)
{
input[j]=0;
}
for(j = 0;j<BUFFER_MIN;j++)
{
frame[22+j] = input[j];
}
for(j=8;j<22+BUFFER_MIN;j++)
{
CRC(frame[j],fcs);
}
CRC(0,fcs);
//printf("CRC: %x",fcs);
frame_length=22+46+1;
frame[68]=fcs;
//printf("CRC: %x",frame[68]);
/*for(j=8;j<69;j++)
{
printf(" %x",frame[j]);
}*/
}
for(int f=0;f<frame_length;f++)//往文件中写入帧信息
{
if(fwrite(&frame[f],sizeof(char),1,fp)!=1)
{
printf("File write error!");
fclose(fp);
}
}
printf("Do you want to write the next frame?(y/n)");
cin>>ch;
if(ch=='n'||ch=='N')
{
loop=false;
}
else
{
printf("\nPlease input some information which we will write into the frame file:\n");
continue;
}
}
fclose(fp);
printf("\nThe frame file has already been writed! It's been saved in %s file ",filename);
}
unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用
//调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们
//采用的crc校验是一位一位的校验;)
{
int temp;
temp=a;temp=temp<<1;
return (unsigned char)(temp>>8);
}
void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数
{
int i;
unsigned char data_input,crcfb;
for(i=0;i<8;i++)
{
data_input=GetFirstBit(ch);
ch=ch<<1;
crcfb=GetFirstBit(crc);
crc=crc<<1;
crc=crc|data_input;
if(crcfb==1) crc=crc^7;
}
}
求大侠帮忙改成C#的,只要解析功能和CRC验证,谢啦啦啦啦...
#include<stdio.h>
#include<conio.h>
#include<io.h>
#include<string.h>
#define BUFFER_MAX 1500
#define BUFFER_MIN 46
char preamble[8];//前导码
char addr_dest[6];//目的地址
char addr_source[6];//源地址
unsigned char length_data[2];//长度字段
unsigned char fcs;//校验序列
char frame[1523];//由于本次采用的8位的CRC校验,所以fcs字段也只有一个字节
char input[BUFFER_MAX+1];//数据字段的最大长度为1500,外加一个"\0"
char writefilename[10];//文件名字
FILE *fp;
bool loop;//循环控制变量
void framer(char *filename);//封装函数
void jiexi(char *filename);//解析函数
unsigned char GetFirstBit(unsigned char& a);
void CRC(unsigned char ch,unsigned char &crc);
void main(int argc,char *argv[])//主函数
{
if(argc!=3)//命令格式不正确时,出现帮助信息
{
printf("command format error!\n");
printf("command foramt:\n");
printf("\n-p 帧封装 : 可执行文件名 -p 数据帧文件名");
printf("\n-u 帧解析 : 可执行文件 -u 数据帧文件名");
printf("\n");
}
else
{
strcpy(writefilename,argv[2]);
if(!strcmp(argv[1],"-p"))
{
framer(writefilename);
}
if(!strcmp(argv[1],"-u"))
{
jiexi(writefilename);
}
getch();
}
}void jiexi(char *filename)//解析函数
{
unsigned char ch;
int j;//循环变量
int data_length;
int count=0;
int number=0;
unsigned char crctemp;
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Failed to open the file!");
return;
}
while(!feof(fp))
{
data_length=0;
crctemp=0;
ch=fgetc(fp);
//printf("%x",ch);
if(ch==0xAA)count++;//count标记前导符的个数;
else
{
count=0;
continue;
}
if(count==7)//找到七个字节连续的前导码
{
count=0;
ch=fgetc(fp);
if(ch==0xAB)//找到帧定界符,开始解析帧
{
number++;//标记帧的个数;
for(j=0;j<6;j++) addr_dest[j]=fgetc(fp);//读入目的地址
for(j=0;j<6;j++) addr_source[j]=fgetc(fp);//读入源地址
length_data[0]=fgetc(fp);//读入长度字段
length_data[1]=fgetc(fp);
for(j=0;j<6;j++)
{
CRC(addr_dest[j],crctemp);//目的地址检验
}
for(j=0;j<6;j++)
{
CRC(addr_source[j],crctemp);//源地址检验
}
for(j=0;j<2;j++)
{
CRC(length_data[j],crctemp);//长度字段检验
}
data_length = length_data[0]*256+length_data[1];//计算数据部分长度
for(j=0;j<data_length;j++)
{
ch=fgetc(fp);
input[j]=ch;
CRC(ch,crctemp);//数据字段检验
}
if(data_length<46)
{
for(j=0;j<46-data_length;j++)
{
ch=fgetc(fp);
CRC(ch,crctemp);//如果数据字段长度小于46,多余的零也要进行校验
}
}
ch=fgetc(fp);
fcs=ch;
CRC(0,crctemp);//最后8bit零检验
//printf("FCS : %x",fcs);
//printf("tempcrc : %x",crctemp);
if(fcs==crctemp)//两者相等,判定帧正确,进行帧信息的输出
{
printf("\n\n=======================Number%d- frame==========================",number);
printf("\n Sequence:%d",number);
printf("\n Front code:");
for(j=0;j<7;j++)
{
printf("AA");
}
printf("\n Bound flag: AB");
printf("\n Detination address:");
for(j=0;j<6;j++)
{
printf("-%x",addr_dest[j]);
}
printf("\n Source address:");
for(j=0;j<6;j++)
{
printf("-%x",addr_source[j]);
}
printf("\n Length :");
for(j=0;j<2;j++)
{
printf("%x",length_data[j]);
}
printf("\nThe data: ");
for(j=0;j<data_length;j++)
{
printf("%c",input[j]);
}
printf("\nCRC CHECK (right):%x",fcs);
printf("\nStatus: Accept");
}
else
{
printf(" \nFrame translation error! Frame number is %d",number);
}
}
}
}
count=0;
printf("\nThe task has already been finished!");
return;
}
void framer(char *filename)//封装函数
{
char ch;
loop = true;
int j;//循环变量
int data_length ;
if((fp = fopen(filename,"wb"))==NULL)
{
printf("Please input some information which we will write into the frame file:\n");
} while(loop)
{
data_length=0;
for(j=0;j<7;j++) //写入前导码,帧前界定符;源地址;目的地址
{
frame[j]=0xaa;
}
frame[7]=0xab;
for(j=8;j<14;j++)
{
frame[j]=0xff;
}
frame[14]=0x00;
frame[15]=0x16;
frame[16]=0x76;
frame[17]=0xb4;
frame[18]=0xe4;
frame[19]=0x77;
scanf("%s",&input[0]);
while(input[data_length] != 0)data_length++;//计算从键盘输入的数据长度
frame[20] = (unsigned char)(data_length >> 8);//写入长度字段,要做类型转换
frame[21] = (unsigned char)(data_length&0xff);
fcs=0;
int frame_length=0;
if(data_length>=BUFFER_MIN)
{
for(j = 0;j<data_length;j++)
{
frame[22+j] = input[j];
}
for(j=8;j<22+data_length;j++)
{
CRC(frame[j],fcs);
}
CRC(0,fcs);//输入数据的最后补上8个bit零
frame_length=22+data_length+1;
frame[frame_length-1]= fcs;
}
else
{
for(j=data_length;j<BUFFER_MIN;j++)
{
input[j]=0;
}
for(j = 0;j<BUFFER_MIN;j++)
{
frame[22+j] = input[j];
}
for(j=8;j<22+BUFFER_MIN;j++)
{
CRC(frame[j],fcs);
}
CRC(0,fcs);
//printf("CRC: %x",fcs);
frame_length=22+46+1;
frame[68]=fcs;
//printf("CRC: %x",frame[68]);
/*for(j=8;j<69;j++)
{
printf(" %x",frame[j]);
}*/
}
for(int f=0;f<frame_length;f++)//往文件中写入帧信息
{
if(fwrite(&frame[f],sizeof(char),1,fp)!=1)
{
printf("File write error!");
fclose(fp);
}
}
printf("Do you want to write the next frame?(y/n)");
cin>>ch;
if(ch=='n'||ch=='N')
{
loop=false;
}
else
{
printf("\nPlease input some information which we will write into the frame file:\n");
continue;
}
}
fclose(fp);
printf("\nThe frame file has already been writed! It's been saved in %s file ",filename);
}
unsigned char GetFirstBit(unsigned char& a) //定义取某一字节的第一位的函数,(为CRC校验,因为利用
//调用ch=fgetc(fp)时,每次都取出文件的一个字节,而我们
//采用的crc校验是一位一位的校验;)
{
int temp;
temp=a;temp=temp<<1;
return (unsigned char)(temp>>8);
}
void CRC(unsigned char ch,unsigned char &crc)//CRC校验函数
{
int i;
unsigned char data_input,crcfb;
for(i=0;i<8;i++)
{
data_input=GetFirstBit(ch);
ch=ch<<1;
crcfb=GetFirstBit(crc);
crc=crc<<1;
crc=crc|data_input;
if(crcfb==1) crc=crc^7;
}
}