等我时间是死到了死循环是什么意思办

查看: 6167|回复: 10
获取SHA1、MD5、CRC等校验值后怎么确保是是官方纯净版
签到天数: 5 天[LV.2]偶尔看看I
马上注册,欢迎加入IT之家社区大家庭。
才可以下载或查看,没有帐号?
下载ISO后,可以用魔方电脑大师(点击访问官网)中的魔方文件校验(点此下载)来获取SHA1、MD5、CRC等校验值,确保下载的是官方纯净版,不给木马病毒留机会
获取SHA1、MD5、CRC等校验值后怎么确保是是官方纯净版
签到天数: 1488 天[LV.10]以坛为家III
和官方的比对啊,如果一样就代表是官方版本了
签到天数: 702 天[LV.9]以坛为家II
沙发为正解。官方版本分享的时候,都给出了sha1值,下载之后校验下,跟官方的比对下,一致的话就可以确认为官方原版
签到天数: 414 天[LV.9]以坛为家II
度娘网盘下载,sha1值会变
签到天数: 862 天[LV.10]以坛为家III
度娘网盘下载,sha1值会变
msdn上下载
签到天数: 486 天[LV.9]以坛为家II
度娘网盘下载,sha1值会变
在度娘网盘上用IDM下载,速度快且不会变。
签到天数: 551 天[LV.9]以坛为家II
msdn上提供的hash chacker自动检验hash值
签到天数: 373 天[LV.9]以坛为家II
这个要试试
签到天数: 37 天[LV.5]常住居民I
签到天数: 796 天[LV.10]以坛为家III
和官方的一样呗
签到天数: 776 天[LV.10]以坛为家III
都一样就行了。
版权所有 (C)最安全的绿色软件下载基地!
扫码浏览手机端页面
热门搜索:
您的位置:
CRC校验工具下载 v2.0 免费版
网友评分:6.4 分
软件星级:
软件大小:475KB
软件语言:简体中文
软件分类:杂类工具
软件授权:免费软件
更新时间:
软件类别:国产软件
软件官网:/
应用平台:Win All
软件标签:
CRC校验工具下载 v2.0 免费版
高速下载通道:其它下载通道:
有问题? &+&
可能感兴趣的软件
(您的评论需要经过审核才能显示)
共0人参与,0条评论
9.7M / 简体中文 / 6.86.3M / 简体中文 / 6.8417M / 简体中文 / 6.6200KB / 简体中文 / 8.712.8M / 简体中文 / 6.44.2M / 简体中文 / 7.747.3M / 简体中文 / 1.0
分类下载排行
01Microsoft Office Excel 2007 官方免费版下载01杂类工具 / 51M02Microsoft Office 2007官方下载 免费完整版02杂类工具 / 605M03word2003官方下载 免费完整版03杂类工具 / 16.0M04MathType 6.9下载 破解版 mathtype公式编辑器04杂类工具 / 6.7M05千月蓝牙软件 10.0.437.0 安装版05杂类工具 / 42.3M06Microsoft Office Visio 2010 官方中文版06杂类工具 / 441M07佳能mp288清零软件 绿色中文版07杂类工具 / 189KB08SPSS 18.0 中文版08杂类工具 / 311.3M09CM网络磁盘最新下载 v2.06 绿色免费版09杂类工具 / 576KB10佳能Canon_LBP3018打印机驱动 安装版10杂类工具 / 17.9M
01名贯四海起名测名软件 V6.01 最新版01杂类工具 / 5.6M02Microsoft Office Excel 2007 官方免费版下载02杂类工具 / 51M03Microsoft Office 2007官方下载 免费完整版03杂类工具 / 605M04Microsoft Office 2007 SP1 中英文便携更新版04杂类工具 / 57.8M05word2003官方下载 免费完整版05杂类工具 / 16.0M06Google Earth Free V5.0. 多国06杂类工具 / 10.8M07番茄花园Windows Server 2003 SP2 简体中文免激活版07杂类工具 / 621M08MathType 6.9下载 破解版 mathtype公式编辑器08杂类工具 / 6.7M09千月蓝牙软件 10.0.437.0 安装版09杂类工具 / 42.3M10Microsoft Office Visio 2010 官方中文版10杂类工具 / 441M
热门与关键
微信公众号
微信号:kuhousy
扫描二维码添加
所有软件均来自网络如有版权问题请联系我们 - 浙公网安备 47号 - 浙ICP备号
Copyright & 2004- online services. All rights reserved.
请简要描述您遇到的错误,我们将尽快予以修订使用C语言实现CRC校验的方法
字体:[ ] 类型:转载 时间:
本篇文章是对使用C语言实现CRC校验的方法进行了详细的分析介绍,需要的朋友参考下
CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。用了一天时间研究了CRC的C语言实现,理解和掌握了基本原理和C语言编程。结合自己的理解简单写下来。
1、CRC简介
CRC检验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个检验码r位(就是CRC码),附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。接收端根据同样的规则校验,以确定传送中是否出错。接收端有两种处理方式:1、计算k位序列的CRC码,与接收到的CRC比较,一致则接收正确。2、计算整个k+r位的CRC码,若为0,则接收正确。CRC码有多种检验位数,8位、16位、32位等,原理相同。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(即乘以2的16次方后),除以一个多项式,最后所得到的余数就是CRC码。求CRC码所采用的是模2运算法则,即多项式除法中采用不带借位的减法运算,运算等同于异或运算。这一点要仔细理解,是编程的基础。CRC-16: (美国二进制同步系统中采用) G(X) = X16 + X15 + X2 + 1CRC-CCITT: (由欧洲CCITT推荐) G(X) = X16 + X12 + X5 + 1CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1
2、按位计算CRC
采用CRC-CCITT多项式,多项式为0x11021,C语言编程时,参与计算为0x1021,这个地方得深入思考才能体会其中的奥妙,分享一下我的思路:当按位计算CRC时,例如计算二进制序列为10 1111时,将二进制序列数左移16位,即为10
00),实际上该二进制序列可拆分为00
00) + 000 00 (00 0000) + 00 00 (00 0000) + 1 00 (00 0000) + …… 现在开始分析运算:&1&对第一个二进制分序列求余数,竖式除法即为0x10000 ^ 0x11021运算,后面的0位保留;&2&接着对第二个二进制分序列求余数,将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余,这一步理解应该没什么问题。如果该分序列为0,无需计算。&3&对其余的二进制序列求余与上面两步相同。&4&计算到最后一位时即为整个二进制序列的余数,即为CRC校验码。该计算方法相当于对每一位计算,运算过程很容易理解,所占内存少,缺点是一位一位计算比较耗时。下面给出C语言实现方法: 代码如下:unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};unsigned char len = 16;void main( void ){&& unsigned long temp = 0;&&&&&& unsigned char *ptr =
&& while( len-- ) {&&&&& for(i = 0x80; i != 0; i = i && 1) {&&&&&&&& temp = temp * 2;&&&&&&&& if((temp & 0x10000) != 0)&&&&&&&&&&& temp = temp ^ 0x11021;&&&&&&&& if((*ptr & i) != 0) &&&&&&&&&&& temp = temp ^ (0x10000 ^ 0x11021);
&&&& }&&& ptr++;&& }&& crc =&& printf("0x%x ",crc);}上面的程序根据运算分析而来,很容易理解。为了节约内存空间,我们对程序作进一步的简化。分析可知,当二进制序列中上一位计算的余数第15bit位为1时,即( 上一位计算的余数 & 0x8000) != 0,计算本位时,上一位余数 * 2后可对0x11021作求余运算,然后再加上本位计算所得余数。这个很好理解,也就是说,打个比方,把它看作简单的除法,计算上一位时的余数乘以2后,如果比较大可以当被除数,就再去除除数求余。有一点和普通除法不同的是,因为多项式除法中采用不带借位的减法运算,所以0x10000也可以被0x11021除,余数并非为0x10000,而是0x1021。这个自己动手算一下就知道了。余数之和也是不带进位的加法运算,即异或。最后还强调一点,因为二进制序列是左移16位后参与运算的,所以,一直算到序列的最后一位也是可以被除的,这点大家要明白。下面给出简化后的C语言实现。 代码如下:unsigned char test[16] ={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};unsigned char len = 16;void main( void ){&& unsigned int crc = 0;&&&& unsigned char *ptr =
&& while( len-- ) {&&&&& for(i = 0x80; i != 0; i = i && 1) {&&&&&&& if((crc & 0x8000) != 0) {&&&&&&&&&& crc = crc && 1;&&&&&&&&&& crc = crc ^ 0x1021;&&&&&&& }&&&&&&& else {&&&&&&&&&& crc = crc && 1;&&&&&&& }&&&&&&& if((*ptr & i) != 0) {&&&&&&&&& crc = crc ^ 0x1021; &&&&&&& }&&&& }&&&& ptr++;&& }
&& printf("0x%x ",crc);}上面这段程序网上较为常见,但冇得详细的解释。通过我上面的详细分析,如果对此段程序理解还有困难,可以对比一下没简化之前的程序,细细品味一哈,还是比较容易理解的。要是还理解不了,还是从头再看下,我码这么多字容易吗。。。。。按位计算CRC代码比较简单,所占内存少,但要一位一位去计算,下面再介绍一种按字节查表快速计算CRC的方法。
3、按字节计算CRC
有了上面按位计算的知识,理解这个就是小case了。还是举前面的例子:当字节计算CRC时,例如计算二进制序列为10 1111时,即0x9a9f时,将二进制序列数左移16位,即为0x9a9f(0 0 0 0),实际上该二进制序列可拆分为0x9a00(0 0 0 0) + 0x009f(0 0 0 0),分析计算时和上面的步骤一样,唯一不同的是计算中上一步的余数CRC要乘以2的八次方参与下一步的运算,这个应该好理解撒。为了简化编程,将计算中的CRC拆成高八位和低八位的形式,高八位的值直接与本位值相加求余,低八位的值乘以2的八次方后作为余数和计算得的余数相加。为了提高计算速度,我们把8位二进制序列数的CRC全部计算出来,放在一个表中,采用查表法可大大提高计算速度。表是怎么得到的呢?当然是计算出来的,下面的程序给出了多项式是0x11021的计算程序。 代码如下:void main( void ){&& unsigned int crc = 0;&&&&
&& for(j = 0; j & 256; j++) {&&&&& crc = 0;&&&&& for(i = 0x80; i != 0; i = i && 1) {&&&&&&&& if((crc & 0x8000) != 0) {&&&&&&&&&&& crc = crc && 1;&&&&&&&&&&& crc = crc ^ 0x1021;&&&&&&& }&&&&&&& else {&&&&&&&&&&& crc = crc && 1;&&&&&&& }&&&&&&& if((j & i) != 0) {&&&&&&&&&&& crc = crc ^ 0x1021;&&&&&&& }&& }&& printf("0x");&& if(crc & 0x10) {&&&&& printf("000");&& }&& else if(crc & 0x100) {&&&&& printf("00");&& }&& else if(crc & 0x1000) {&&&&& printf("0");&& }
&& printf("%x, ",crc);&& }}如果你不是使用的0x11021多项式,只需把程序中0x1021换成其他的就可以了。后面的几个printf语句为了控制使生成的表比较整齐,如果无所谓,可直接用printf("0x%x, ",crc);代替。生成的表如下:0x1, 0x3, 0xa5, 0x60c6, 0x70e7, 0x9, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x0, 0x2, 0x52b5, 0xf7, 0x62d6, 0x8, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x3, 0x1, 0x64e6, 0x74c7, 0x44a4, 0xa, 0xb54b, 0x9, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x2, 0x0, 0x76d7, 0x66f6, 0xb4, 0xb75b, 0xa77a, 0x8, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0xa7, 0x1, 0x3, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x9, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0xa9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0xa1, 0x30c2, 0x20e3, 0x5, 0x7, 0x83b9, 0xfb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0xf3, 0x32d2, 0x4, 0x6, 0xb5ea, 0xa5cb, 0x95a8, 0xe, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x6, 0x4, 0xdb, 0xb7fa, 0xb8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0xb0, 0x6, 0x4, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5, 0x7, 0x18c0, 0x08e1, 0xa3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,好了,我们来写按字节计算的源程序: 代码如下:unsigned char test[16] ={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};unsigned char len = 16;unsigned int crc_table[256] ={x1, 0x3, 0xa5, 0x60c6, 0x70e7, 0x9, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x0, 0x2, 0x52b5, 0xf7, 0x62d6, 0x8, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x3, 0x1, 0x64e6, 0x74c7, 0x44a4, 0xa, 0xb54b, 0x9, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x2, 0x0, 0x76d7, 0x66f6, 0xb4, 0xb75b, 0xa77a, 0x8, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0xa7, 0x1, 0x3, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x9, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0xa9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0xa1, 0x30c2, 0x20e3, 0x5, 0x7, 0x83b9, 0xfb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0xf3, 0x32d2, 0x4, 0x6, 0xb5ea, 0xa5cb, 0x95a8, 0xe, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x6, 0x4, 0xdb, 0xb7fa, 0xb8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0xb0, 0x6, 0x4, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5, 0x7, 0x18c0, 0x08e1, 0xa3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};void main(void){&& unsigned int crc = 0;&& unsigned char crc_H8;&& unsigned char *ptr =
&& while( len-- ) {&&&&& crc_H8 = (unsigned char)(crc && 8);&&&&& crc = crc && 8;&&&&& crc = crc ^ crc_table[ crc_H8 ^ *ptr];&&&&& ptr++;&& }&& printf("0x%x ",crc);}4、按半字节计算CRC
是不是感觉上面的表太大了,不是很爽,我们再来改进一下,按半字节计算,原理我就不赘述了,程序如下: 代码如下:unsigned char test[16] ={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff};unsigned char len = 16;unsigned int crc_table[16] ={0x1, 0x3, 0xa5, 0x60c6, 0x70e7, 0x9, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef};void main(void){unsigned int crc = 0;unsigned char crc_H4;unsigned char *ptr =
while( len-- ){crc_H4 = (unsigned char)(crc && 12);crc = crc && 4;crc = crc ^ crc_table[ crc_H4 ^ (*ptr && 4)];crc_H4 = (unsigned char)(crc && 12);crc = crc && 4;crc = crc ^ crc_table[ crc_H4 ^ (*ptr & 0x0f)];ptr++;}printf("0x%x ",crc);}
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具CRC校验是什么意思_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
CRC校验是什么意思
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢CRC校验算法及C#程序实现
我的图书馆
CRC校验算法及C#程序实现
CRC校验可以运用于传输数据过程中的验证,发送端发送有效数据时,先根据有效数据和生成多项式(比如CCITT标准的多项式是X16+X12+X5+1)计算出CRC校验码,把CRC校验码加到有效数据后面一起发送;当接收数据时,取出前面有效数据部分,用同样生成多项式计算出CRC校验码,然后取出接收数据后面CRC校验码部分,对比两个校验码是否相同。如果相同,认为接收到的数据与发送的数据是一致的,传输正确;如果不同,认为传输数据出错。
CRC(循环冗余校验)算法主要是一个计算除法的过程。算法有两个输入值,第一个是输入的信号,这通常是一个很长的数据,作为被除数。第二个是一个与具体的CRC算法相关的多项式,称为生成多项式,用作除数。基本的计算过程是,两者作模2除法(本质上是对应位做异或运算),余数就是CRC校验码的结果。
I、基本算法(人工笔算):
以CRC16-CCITT为例进行说明,它的生成多项式是X16+X12+X5+1,CRC校验码为16位,生成多项式17位。假如数据流为4字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];
数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算(相当于按位异或),所得的余数就是CRC校验码。
发送时的数据流为6字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];
II、计算机算法1(比特型算法):
1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;
2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);
3)重复第2步,直到数据流(6字节)全部移入寄存器;
4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
III、计算机算法2(字节型算法):
字节型算法的一般描述为:本字节的CRC码,等于上一字节CRC码的低8位左移8位,与上一字节CRC右移8位同本字节异或后所得的CRC码异或。
字节型算法如下:
1)CRC寄存器组初始化为全"0"(0x0000)。(注意:CRC寄存器组初始化全为1时,最后CRC应取反。)
2)CRC寄存器组向左移8位,并保存到CRC寄存器组。
3)原CRC寄存器组高8位(右移8位)与数据字节进行异或运算,得出一个指向值表的索引。
4)索引所指的表值与CRC寄存器组做异或运算。
5)数据指针加1,如果数据没有全部处理完,则重复步骤2)。
6)得出CRC。
下面用一个简单的例子来说明CRC算法的计算过程。输入信号是101111,生成多项式是1001(对应数学表达式为X3+1)。被除数后面需要补充3个0。即对1001做模2除法运算,得到一个3位的余数010,这个就是CRC校验码。在上例中,余数为010。将余数附加到输入信号后面,即发送数据为,取接收端接收到的数据的前六位对1001做模2除法运算,看看得到的CRC校验码是不是等于接收数据的后三位。如果是,传输正确,如果不是,传输错误。
4 C#程序代码
这是采用比特型算法编写的程序。
以下CRCVerifyLHY类中的GetCRC方法就是用来计算CRC校验码的,在Main函数中byte数组用来存放要传输的数据(注意:前面两个字节都初始为0,用来存放CRC校验码结果,真正要传输的数据从第三个字节开始)。这里简单地只传输一个字节的数据,如下面的157,可以先人工用笔算出一个CRC校验码,然后看程序的输出是否和人工算的一致,经本人验证,此算法程序应该是正确的。
using System.Collections.G
using System.T
namespace CRCVerify
class CRCVerifyLHY
//dataStream数组中的dataStream[0]和dataStream[1]为CRC校验码的初始值,即0x0000。其他的数组元素即为要传输的信息码,cRC_16为生成多项式的简记式
//以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位,其简记式实际是0x11021,
//但是生成多项式的最高位固定为1,故在简记式中忽略最高位1了,CRC16-CCITT的简记式就可以写为0x1021
public static ushort GetCRC(byte[] dataStream, ushort cRC_16)
ushort cRC_temp = Convert.ToUInt16((dataStream[dataStream.Length - 1] && 8) + dataStream[dataStream.Length - 2]);
int totalBit = (dataStream.Length - 2) * 8;
for (int i = totalBit - 1; i &=& 0; i--)
ushort a = Convert.ToUInt16(i / 8);
ushort b = Convert.ToUInt16(i % 8);
ushort nextBit = Convert.ToUInt16((dataStream[a] && b) & 0x01);
if (cRC_temp &= 32768)
cRC_temp = Convert.ToUInt16(((cRC_temp - 32768) && 1) + nextBit);
cRC_temp = Convert.ToUInt16(cRC_temp ^ cRC_16);
cRC_temp = Convert.ToUInt16((cRC_temp && 1) + nextBit);
return cRC_
class Program
static void Main(string[] args)
byte[] array = new byte[] { 0, 0, 157 };
ushort cRC_Result = CRCVerifyLHY.GetCRC(array, 0x1021);
Console.WriteLine(cRC_Result);
Console.ReadKey();
建议使用以下:
namespace USTC
&&& /// &summary&
&&& /// 消息CRC校验算法
&&& /// &/summary&
&&& public class CRC
&&&&&&& //private int key = 0x11021H;
&&&&&&& public CRC()
&&&&&&& public static int GetKey(byte[] data)
&&&&&&&&&&& int count = data.L
&&&&&&&&&&& byte[] buf = new byte[data.Length + 2];
&&&&&&&&&&& data.CopyTo(buf, 0);
&&&&&&&&&&& int ptr = 0;
&&&&&&&&&&& int i = 0;
&&&&&&&&&&& int crc = 0;
&&&&&&&&&&& byte crc1, crc2, crc3;
&&&&&&&&&&& crc1 = buf[ptr++];
&&&&&&&&&&& crc2 = buf[ptr++];
&&&&&&&&&&& buf[count] = 0;
&&&&&&&&&&& buf[count + 1] = 0;
&&&&&&&&&&& while (--count &= 0)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& crc3 = buf[ptr++];
&&&&&&&&&&&&&&& for (i = 0; i & 8; i++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& if (((crc1 & 0x80) && 7) == 1)//判断crc1高位是否为1
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& crc1 = (byte)(crc1 && 1); //移出高位
&&&&&&&&&&&&&&&&&&&&&&& if (((crc2 & 0x80) && 7) == 1)//判断crc2高位是否为1
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& crc2 = (byte)(crc2 && 1);//crc2移出高位
&&&&&&&&&&&&&&&&&&&&&&& if (((crc3 & 0x80) && 7) == 1) //判断crc3高位是否为1
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& crc3 = (byte)(crc3 && 1);//crc3移出高位
&&&&&&&&&&&&&&&&&&&&&&& crc1 = (byte)(crc1 ^ 0x10);
&&&&&&&&&&&&&&&&&&&&&&& crc2 = (byte)(crc2 ^ 0x21);
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& else
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& crc1 = (byte)(crc1 && 1); //移出高位
&&&&&&&&&&&&&&&&&&&&&&& if (((crc2 & 0x80) && 7) == 1)//判断crc2高位是否为1
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& crc1 = (byte)(crc1 | 0x01);//crc1低位由0变1
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& crc2 = (byte)(crc2 && 1);//crc2移出高位
&&&&&&&&&&&&&&&&&&&&&&& if (((crc3 & 0x80) && 7) == 1) //判断crc3高位是否为1
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& crc2 = (byte)(crc2 | 0x01); //crc2低位由0变1
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& crc3 = (byte)(crc3 && 1);//crc3移出高位
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&&&&&& crc = (int)((crc1 && 8) + crc2);
&&&&&&&&&&&
发表评论:
TA的推荐TA的最新馆藏}

我要回帖

更多关于 死循环小说 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信