CRC 循环冗余校验码 (VC编程)
2012-04-28 23:33
190 查看
/*
CRC 循环冗余校验码 (VC编程)
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码就是:
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
--------------------------------------------------------------------------------
这个问题第2个回答:
给你一个写好的 嘿嘿
*/
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;
}
/*
--------------------------------------------------------------------------------
这个问题第3个回答:
引用的时候只需在要调用的程序中添加如下代码 */
unsigned int uiCRC;
BYTE bCommand[17];//校验的数组
BYTE str[2] ;//存放校验值
uiCRC = CRC16(bCommand,17); //CRC16校验
str[0] = uiCRC/0x100; //其中一个检验值
str[1] = uiCRC%0x100; //另一个校验值
/*
--------------------------------------------------------------------------------
这个问题第4个回答:
BYTE bCommand[17];//校验的数组
数组大小你可以随便修改
*/
CRC 循环冗余校验码 (VC编程)
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码就是:
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
--------------------------------------------------------------------------------
这个问题第2个回答:
给你一个写好的 嘿嘿
*/
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;
}
/*
--------------------------------------------------------------------------------
这个问题第3个回答:
引用的时候只需在要调用的程序中添加如下代码 */
unsigned int uiCRC;
BYTE bCommand[17];//校验的数组
BYTE str[2] ;//存放校验值
uiCRC = CRC16(bCommand,17); //CRC16校验
str[0] = uiCRC/0x100; //其中一个检验值
str[1] = uiCRC%0x100; //另一个校验值
/*
--------------------------------------------------------------------------------
这个问题第4个回答:
BYTE bCommand[17];//校验的数组
数组大小你可以随便修改
*/
相关文章推荐
- CRC 循环冗余校验码 (VC编程)
- VC++动态链接库(DLL)编程深入浅出(四)
- VC++下命名管道编程的原理及实现
- 浅谈HOOK技术在VC编程中的应用
- VC 动态链接库编程之MFC扩展DLL
- VC++下对匿名管道的编程实现
- VC2005 DLL编程 LNK2005 dllmain重定义问题
- vc 网络编程(socket)
- VC下的Unicode编程
- vc socket编程
- VC编程中常用快捷键
- VC++中Socket编程的实现-TCP客户端
- [搬家帖]VC系统托盘编程指南
- VC 多线程编程 blogdown整理
- VC编程经验汇总(一)
- VC++ 编程控制软件编写计划
- VC++动态链接库编程之非MFC DLL
- VC数据库编程概述
- VC图像编程
- 【vc】网络编程_socket编程(转载)