u16 crcGetRegisters() {return regs.val;} crcInputBit(bit in) {bit a;
a=regs.bits.bit0^in; regs.val>>1;
if(a) regs.val^=0x8408; }
2.字节型算法
数字通信系统一般是对一帧数据进行CRC校验,而字节是帧的基本单位。最常用的是一种按字节查表的快速算法。该算法基于这样一个事实:计算本字节后的CRC码,等于上一字节CRC右移8位和本字节之和再与上一字节余式CRC码的低8位左移8位相加后所求得的CRC码。如果我们把8位二进制序列数的CRC全部计算出来,放在一个表里,那么编码时只要从表中查找对应的值进行处理即可。
算法如下:
1) 寄存器组初始化为全1。 2) 寄存器组向右移动一个字节。
3) 刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。 4) 将索引所指的表值与寄存器组做异或运算。
5) 数据指针加1,如果数据没有全部处理完,则重复步骤2. 6) 寄存器组取反,得到CRC,附加在数据之后。 验证算法:
1) 寄存器组初始化为全1. 2) 寄存器组向右移动一个字节。
3) 刚移出的那个字节与数据字节进行异或运算,得出一个指向值表的索引。 4) 将索引所指的表值与寄存器组做异或运算。
5) 数据指针加1,如果数据没有全部处理完,则重复步骤2. 6) 判断寄存器组的值是否等于“Magic Value”,若相等则通过, 7) 否则失败。
11
开始
以二进制、可读写方式打开输出文件写入前导码和这界定符获取当前文件指针写入目的地址和源地址打开输入数据文件、获得稳健长度length,并将长度值写入输出文件将输入数据文件的内容填入数据字段数据字段长度=46B填充(46-length)字节‘0’关闭输入数据文件添加1字节0,用于CRC计算计算CRC值,填充校验字段风转完成,关闭输出文件 图2.程序流程图
12
图3.CRC计算流程图
13
6 程序代码
#include
void main(int argc,char*argv[]) {
if(argc!=3) { cout<<\请按以下格式输入命令行: framer inputfile outputfile\ return; }
fstream file;
file.open(argv[2],ios::in|ios::out|ios::binary|ios::trunc); for(int i=0;i<7;i++) file.put(char(0xaa)); file.put(char(0xab));
long pCrcs=file.tellp(); char
dst_addr[6]={char(0x00),char(0x00),char(0x80),char(0x1a),char(0xe6),char(0x65)}; file.write(dst_addr,sizeof(dst_addr));
ifstream infile;
infile.open(argv[1],ios::binary); infile.seekg(0,ios::end);
short length=(short)infile.tellg(); file.put(char(length/256)); file.put(char(length%6));
char*data=new char[length]; infile.seekg(0,ios::beg); infile.read(data,length);
infile.close(); delete data;
if(length<46) for(int i=0; i<46-length;i++) ;file.put(char(0x00));
long pCrc=file.tellp(); file.put(char(0x00));
short total=short(file.tellp())-(short)pCrcs; file.seekg(pCrcs,ios::beg); unsigned char crc=0; while(total--) {
14
}
}
unsigned char temp; file.get(temp);
for(unsigned char i=(unsigned char)0x80;i>0;i>>=1) { if(crc&0x80) { crc<<=1; if(temp&i) crc^=0x01; crc^=0x07; } else { crc<<=1; if(temp&i) crc^=0x01; } }
file.seekg(pCrc,ios::beg); file.put(crc);
while(!file.eof()) { unsigned char temp; file.get(temp); cout< cout<<\帧文件 \封装完成\ 15