惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
Stack Overflow Blog
Stack Overflow Blog
人人都是产品经理
人人都是产品经理
The GitHub Blog
The GitHub Blog
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Y
Y Combinator Blog
The Cloudflare Blog
Last Week in AI
Last Week in AI
B
Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tailwind CSS Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
小众软件
小众软件
Google DeepMind News
Google DeepMind News
D
DataBreaches.Net
博客园 - 司徒正美
B
Blog RSS Feed
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
L
LangChain Blog

博客园 - 饽饽

C语言指针的用法 无线网卡或笔记本找不到网络的一个原因 (one reason of your laptop cannot find wireless network) 电脑能够上QQ,可以ping IP,玩网络游戏,就是不能上网,收发电子邮件的解决办法 有关学校的打油诗 CMPP2.0 协议SP端的·NET开发 C++中的虚函数(virtual function) - 饽饽 - 博客园 MIMO的文章 VC++调用其它语言编写的程序 - 饽饽 - 博客园 VC++调用其它程序2 - 饽饽 - 博客园 Vc编程基础 VC MFC基本控件的使用 VC基础教程 基于WINSOCK控件的VC网络通讯程序 VISCAL C++下WINSOCK CONTROL类(ACTIVEX)的使用 用Winsock实现语音全双工通信使用 socket编程原理 VC常用技巧集锦 windows网络编程 用Winsock控件实现点对点通信
CRC 循环冗余校验码 (VC编程)
饽饽 · 2010-01-29 · via 博客园 - 饽饽

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];//校验的数组
数组大小你可以随便修改