关于CRC校验问题 有一设备的是用 CRC为16位循环冗余校验码,生成多项式为:G(X)=X16+X15+X13+1比如 41 30 30 31 04 32 37 30 30 5A 他的校验位是86 C7不知道这个校验程序是怎么写的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CRC(Cyclic Redundancy Check)循环冗余校验码 是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢冒然行动。 对通信的可靠性检查就需要‘校验’,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。 CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是: 1、首先将原信息码(kbit)左移r位(k+r=n) 2、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。 非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是: 0+0=1+1=0,1+0=0+1=1即‘异’则真,‘非异’则假。 由此得到定理:a+b+b=a 也就是‘模2减’和‘模2加’直值表完全相同。 有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。例如: g(x)=x4+x3+x2+1,(7,3)码,信息码110产生的CRC码就是: 10111101 | 110,0000 111 01 1 0100 1 1101 1001余数是1001,所以CRC码是110,1001标准的CRC码是,CRC-CCITT和CRC-16,它们的生成多项式是: CRC-CCITT=x16+x12+x5+1 CRC-16=x16+x15+x2+1引用自:http://www.programfan.com/blog/article.asp?id=11042 给你一个写好的 嘿嘿unsigned short CReadDateDlg::CRC16(unsigned char *data, unsigned char length){ unsigned short reg_crc; unsigned short s_crcchk; s_crcchk = 0; reg_crc = 0xffff; while(length--) { reg_crc ^= *data++; for(s_crcchk = 0; s_crcchk < 8; s_crcchk ++) { if(reg_crc & 0x01) { reg_crc = (reg_crc >> 1)^0xa001; } else { reg_crc = reg_crc >> 1; } } } return reg_crc; } 引用的时候只需在要调用的程序中添加如下代码 unsigned int uiCRC; BYTE bCommand[17];//校验的数组 BYTE str[2] ;//存放校验值 uiCRC = CRC16(bCommand,17); //CRC16校验 str[0] = uiCRC/0x100; //其中一个检验值 str[1] = uiCRC%0x100; //另一个校验值 BYTE bCommand[17];//校验的数组 数组大小你可以随便修改 http://topic.csdn.net/u/20071226/09/22c68929-adb1-4739-add5-75915351d0f0.html这是我当初学CRC-16的时候的帖子 恩,还是没怎么看明白 G(X)=X16+X15+X13+1多相式的值是不是0xa001 MFC如何在图像控件上绘图 再开一贴求解! 关于界面的美化? 两种方法是用COM组件 ocx控件事件的触发问题,为何有时候不能触发? [请教]HOOK 和 模拟鼠标双击 如何获得 CBCGProp项目的文字? 怎样才能为ActiveX控件生成许可证包? 画图!! !谁知道怎么制作VC6.0的向导(wizard) 如何让一个系统服务程序在控制面板的服务中看不见啊 非模态对话框 显示
是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢冒然行动。 对通信的可靠性检查就需要‘校验’,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。 CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。 它的编码规则是:
1、首先将原信息码(kbit)左移r位(k+r=n)
2、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。 非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是:
0+0=1+1=0,1+0=0+1=1
即‘异’则真,‘非异’则假。
由此得到定理:a+b+b=a 也就是‘模2减’和‘模2加’直值表完全相同。 有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。例如: g(x)=x4+x3+x2+1,(7,3)码,信息码110产生的CRC码就是:
101
11101 | 110,0000
111 01
1 0100
1 1101
1001
余数是1001,所以CRC码是110,1001标准的CRC码是,CRC-CCITT和CRC-16,它们的生成多项式是:
CRC-CCITT=x16+x12+x5+1
CRC-16=x16+x15+x2+1引用自:http://www.programfan.com/blog/article.asp?id=11042
unsigned short CReadDateDlg::CRC16(unsigned char *data, unsigned char length)
{
unsigned short reg_crc;
unsigned short s_crcchk;
s_crcchk = 0;
reg_crc = 0xffff;
while(length--)
{
reg_crc ^= *data++;
for(s_crcchk = 0; s_crcchk < 8; s_crcchk ++)
{
if(reg_crc & 0x01)
{
reg_crc = (reg_crc >> 1)^0xa001;
}
else
{
reg_crc = reg_crc >> 1;
}
}
}
return reg_crc;
}
unsigned int uiCRC;
BYTE bCommand[17];//校验的数组
BYTE str[2] ;//存放校验值
uiCRC = CRC16(bCommand,17); //CRC16校验
str[0] = uiCRC/0x100; //其中一个检验值
str[1] = uiCRC%0x100; //另一个校验值
数组大小你可以随便修改