// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158

方法1:将存有数据的字节数组进行逐位计算,求得字节形式的CRC

void  crc16( byte  d[],  int  len)
... {
         byte  b  =   0 ;
         ushort  crc  =   0xffff ;
         int  i, j;

         for (i = 0 ; i < len; i ++ )
         ... {        
                 for (j = 0 ; j < 8 ; j ++ )
                 ... {
                        b  =  ((d[i] << j) & 0x80 )  ^  ((crc & 0x8000 ) >> 8 );
                        
                        crc <<= 1 ;

                         if (b != 0 )        crc ^= 0x1021 ;
                }
        }
        crc  =   ~ crc;

        printf( " crc: 0x%.4X " , crc);
}

方法2:提前构造0~255的CRC表,利用查表法计算CRC

ushort  crc_table[ 256 ] = ... { 
         0x0000 ,  0x1021 ,  0x2042 ,  0x3063 ,  0x4084 ,  0x50a5 ,  0x60c6 ,  0x70e7 , 
         0x8108 ,  0x9129 ,  0xa14a ,  0xb16b ,  0xc18c ,  0xd1ad ,  0xe1ce ,  0xf1ef , 
         0x1231 ,  0x0210 ,  0x3273 ,  0x2252 ,  0x52b5 ,  0x4294 ,  0x72f7 ,  0x62d6 , 
         0x9339 ,  0x8318 ,  0xb37b ,  0xa35a ,  0xd3bd ,  0xc39c ,  0xf3ff ,  0xe3de , 
         0x2462 ,  0x3443 ,  0x0420 ,  0x1401 ,  0x64e6 ,  0x74c7 ,  0x44a4 ,  0x5485 , 
         0xa56a ,  0xb54b ,  0x8528 ,  0x9509 ,  0xe5ee ,  0xf5cf ,  0xc5ac ,  0xd58d , 
         0x3653 ,  0x2672 ,  0x1611 ,  0x0630 ,  0x76d7 ,  0x66f6 ,  0x5695 ,  0x46b4 , 
         0xb75b ,  0xa77a ,  0x9719 ,  0x8738 ,  0xf7df ,  0xe7fe ,  0xd79d ,  0xc7bc , 
         0x48c4 ,  0x58e5 ,  0x6886 ,  0x78a7 ,  0x0840 ,  0x1861 ,  0x2802 ,  0x3823 , 
         0xc9cc ,  0xd9ed ,  0xe98e ,  0xf9af ,  0x8948 ,  0x9969 ,  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 , 
         0x9188 ,  0x81a9 ,  0xb1ca ,  0xa1eb ,  0xd10c ,  0xc12d ,  0xf14e ,  0xe16f , 
         0x1080 ,  0x00a1 ,  0x30c2 ,  0x20e3 ,  0x5004 ,  0x4025 ,  0x7046 ,  0x6067 , 
         0x83b9 ,  0x9398 ,  0xa3fb ,  0xb3da ,  0xc33d ,  0xd31c ,  0xe37f ,  0xf35e , 
         0x02b1 ,  0x1290 ,  0x22f3 ,  0x32d2 ,  0x4235 ,  0x5214 ,  0x6277 ,  0x7256 , 
         0xb5ea ,  0xa5cb ,  0x95a8 ,  0x8589 ,  0xf56e ,  0xe54f ,  0xd52c ,  0xc50d , 
         0x34e2 ,  0x24c3 ,  0x14a0 ,  0x0481 ,  0x7466 ,  0x6447 ,  0x5424 ,  0x4405 , 
         0xa7db ,  0xb7fa ,  0x8799 ,  0x97b8 ,  0xe75f ,  0xf77e ,  0xc71d ,  0xd73c , 
         0x26d3 ,  0x36f2 ,  0x0691 ,  0x16b0 ,  0x6657 ,  0x7676 ,  0x4615 ,  0x5634 , 
         0xd94c ,  0xc96d ,  0xf90e ,  0xe92f ,  0x99c8 ,  0x89e9 ,  0xb98a ,  0xa9ab , 
         0x5844 ,  0x4865 ,  0x7806 ,  0x6827 ,  0x18c0 ,  0x08e1 ,  0x3882 ,  0x28a3 , 
         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  crc16( byte  d[],  int  len)
... {
         byte  b  =   0 , hbit  =   0 ;
         ushort  crc  =   0xffff ;
         int  i;

         for (i = 0 ; i < len; i ++ )
         ... {        
                hbit  =  (crc & 0xff00 ) >> 8 ;
                crc <<= 8 ;
                crc  ^=  crc_table[hbit ^ d[i]];
        }
        
        crc  =   ~ crc;

        printf( " crc: 0x%.4X " , crc);        
}

方法3:完整C#版本 - 算法与方法2同

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  CrcTest
... {
     class  Program
     ... {
         static   ushort [] crc_table  =
         ... {
                 0x0000 ,  0x1021 ,  0x2042 ,  0x3063 ,  0x4084 ,  0x50a5 ,  0x60c6 ,  0x70e7 , 
                 0x8108 ,  0x9129 ,  0xa14a ,  0xb16b ,  0xc18c ,  0xd1ad ,  0xe1ce ,  0xf1ef , 
                 0x1231 ,  0x0210 ,  0x3273 ,  0x2252 ,  0x52b5 ,  0x4294 ,  0x72f7 ,  0x62d6 , 
                 0x9339 ,  0x8318 ,  0xb37b ,  0xa35a ,  0xd3bd ,  0xc39c ,  0xf3ff ,  0xe3de , 
                 0x2462 ,  0x3443 ,  0x0420 ,  0x1401 ,  0x64e6 ,  0x74c7 ,  0x44a4 ,  0x5485 , 
                 0xa56a ,  0xb54b ,  0x8528 ,  0x9509 ,  0xe5ee ,  0xf5cf ,  0xc5ac ,  0xd58d , 
                 0x3653 ,  0x2672 ,  0x1611 ,  0x0630 ,  0x76d7 ,  0x66f6 ,  0x5695 ,  0x46b4 , 
                 0xb75b ,  0xa77a ,  0x9719 ,  0x8738 ,  0xf7df ,  0xe7fe ,  0xd79d ,  0xc7bc , 
                 0x48c4 ,  0x58e5 ,  0x6886 ,  0x78a7 ,  0x0840 ,  0x1861 ,  0x2802 ,  0x3823 , 
                 0xc9cc ,  0xd9ed ,  0xe98e ,  0xf9af ,  0x8948 ,  0x9969 ,  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 , 
                 0x9188 ,  0x81a9 ,  0xb1ca ,  0xa1eb ,  0xd10c ,  0xc12d ,  0xf14e ,  0xe16f , 
                 0x1080 ,  0x00a1 ,  0x30c2 ,  0x20e3 ,  0x5004 ,  0x4025 ,  0x7046 ,  0x6067 , 
                 0x83b9 ,  0x9398 ,  0xa3fb ,  0xb3da ,  0xc33d ,  0xd31c ,  0xe37f ,  0xf35e , 
                 0x02b1 ,  0x1290 ,  0x22f3 ,  0x32d2 ,  0x4235 ,  0x5214 ,  0x6277 ,  0x7256 , 
                 0xb5ea ,  0xa5cb ,  0x95a8 ,  0x8589 ,  0xf56e ,  0xe54f ,  0xd52c ,  0xc50d , 
                 0x34e2 ,  0x24c3 ,  0x14a0 ,  0x0481 ,  0x7466 ,  0x6447 ,  0x5424 ,  0x4405 , 
                 0xa7db ,  0xb7fa ,  0x8799 ,  0x97b8 ,  0xe75f ,  0xf77e ,  0xc71d ,  0xd73c , 
                 0x26d3 ,  0x36f2 ,  0x0691 ,  0x16b0 ,  0x6657 ,  0x7676 ,  0x4615 ,  0x5634 , 
                 0xd94c ,  0xc96d ,  0xf90e ,  0xe92f ,  0x99c8 ,  0x89e9 ,  0xb98a ,  0xa9ab , 
                 0x5844 ,  0x4865 ,  0x7806 ,  0x6827 ,  0x18c0 ,  0x08e1 ,  0x3882 ,  0x28a3 , 
                 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  
        } ; 


         static   byte [] data  =
         ... {
                 0xF0 ,  0x00 ,  0x10 ,  0x00 ,  0xA2 ,  0x00 ,  0x00 ,  0x94 ,  0x91 ,  0x5B ,  0x02 ,  0x00 ,  0xEC ,  0x60 ,  0x6F ,  0x1C ,
                 0xA2 ,  0x4C ,  0x65 ,  0x57 ,  0x53 ,  0xA1 ,  0xB0 ,  0x58 ,  0x00 ,  0x0A ,  0x4F ,  0xD8 ,  0xE8 ,  0xA7 ,  0x55 ,  0xF0 ,
                 0x24 ,  0xEE ,  0x16 ,  0x52 ,  0x0A ,  0x08 ,  0x5F ,  0x0F ,  0x7F ,  0xC0 ,  0x00 ,  0x00 ,  0x4D  
        } ;

         static   void  Main( string [] args)
         ... {
            Console.WriteLine(  " 0x{0,4:X} " , getCRC_CCITT(data, data.Length));
            Console.Read();
        }

         public   static   ushort  getCRC_CCITT( byte [] data,  int  len)
         ... {
             byte  hbit  =   0 ;
             ushort  crc  =   0xffff ;

             for  ( int  i  =   0 ; i  <  len; i ++ )
             ... {
                hbit  =  ( byte )((crc  &   0xff00 )  >>   8 );
                crc  <<=   8 ;
                crc  ^=  crc_table[hbit  ^  data[i]];
            }
            crc  =  ( ushort ) ~ crc;

             return  crc;
        }
    }
}

几种求CRC-CCITT的方法 [C/C#]相关推荐

  1. 用Matlab比较三种求序列相关的方法

    常规方法 用xcorr函数. 用filter函数 filter函数中,将分母设为1,则其结构就是乘累加,和相关一致.只不过这里要注意,求相关的时候,要将filter的系数b倒序. 用fft求序列相关 ...

  2. 三种求字符串长度的方法

    目录 第一种:使用库函数strlen() 第二种:使用指针 第三种:使用递归的方式 第一种:使用库函数strlen() #include <stdio.h> #include <st ...

  3. 【数字图像处理】一种求图像边缘的方法

    一幅图像,背景为黑色.其中有一个白色物体,其边缘连续.现在要求出其外边缘,即与黑色背景相交的部分,组成边缘线,并且由单个像素组成. 思想: 首先找到位于图像最上方的那个白色点. 然后从这个白色点(当前 ...

  4. 水仙花数java_Java三种求水仙花数的方法

    水仙花数:水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:370=33+73+00:371=33+73+13,370.371就是一个水仙花数 注意:要判断一个三位数是不是水仙花数,得先 ...

  5. 【MATLAB】几种求矩阵伪逆的方法

    几种求矩阵伪逆的方法 A*x=y当A不可逆如何解x 求伪逆有五种方法,左右同时乘以A','chol()分解,qr() 分解,svd()分解和pinv()求伪逆,下面来比较一下哪个最优秀. 如果A是个3 ...

  6. 无数种求逆元的方法总结

    乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在  逆元的含义:模n意义下,1个数a如 ...

  7. 一种求周期二元线性序列的极小多项式的方法

    一种求线性周期序列的极小多项式和线性复杂度的方法 前面说到了BM算法,这里再介绍一个求周期序列的线性复杂度的方法.本方法看起来似乎比Berlekamp-Massey算法(BM算法一般用于求有限长序列的 ...

  8. Matlab两种求相位的方法

    在matlab中有两种求相位方法. 1.使用phase函数. 比如a = 1+j*2 phase(a),则可以就a的相位.这个函数取实部为x轴,虚部为y轴. 2.使用函数atan2. atan2(y, ...

  9. crc16的c语言函数 计算ccitt_使用C语言实现CRC校验的方法

    CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理 ...

  10. 微带线特性阻抗计算公式_几种计算微带线特性阻抗的方法.pdf

    几种计算微带线特性阻抗的方法 周刊 年第 期 ○信息技术教学与研究 2011 25 几种计算微带线特性阻抗的方法 段卓琦 大理学院 工程学院 云南 大理 ( , 671000 ) 摘 要 本文从不同的 ...

最新文章

  1. flutter中的路由跳转
  2. 4、jquery表格操作
  3. 智源论坛报名 | 智能信息检索与挖掘报告会(9月17日)
  4. Oracle 作业学习总结
  5. flash期末作业成品_基于“新工科”的工科物理作业模式研究
  6. 雌性激素过高怎么办?
  7. Android UI之ProgressBar
  8. Asp.Net_文件操作基类
  9. LoadRunner+Android模所器实现抓包并调试本地服务端
  10. shell学习过程中的错误集锦
  11. Java学习笔记--反射API
  12. echart水滴_echart 水滴图
  13. 再回顾SGX初始化(一)——环境检查
  14. 【物理学术竞赛】——绳上的球(再续)
  15. java 周次_JAVA计算学校学期周次
  16. IObit Driver Booster 无法更新驱动的解决办法
  17. 判断字符串不超过20个字符_如何阻止超过140个字符的推文(如果确实需要)
  18. 音视频开发——概述(含TUTK demo iOS)
  19. Vmware安装Centos及Linux的介绍,命令
  20. 计算机多媒体培训心得体会,学习计算机多媒体技术心得体会

热门文章

  1. C++(14):lambda对捕获变量进行赋值
  2. 使用cpolar轻松创建立个人云盘
  3. IT行业打工人对暴富有多渴望?
  4. SqlServer中行转列的PIVOT函数
  5. python中偏函数的应用
  6. 有关PMP考试成绩如何查询
  7. JAVA电费管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  8. MAYA软件安装全过程!3D游戏建模新手,看一个,会一个!
  9. gRPC/C++的Makefile编写
  10. figlet - 字符画工具