几种求CRC-CCITT的方法 [C/C#]
// 所有原创文章转载请注明作者及链接
// blackboycpp(AT)gmail.com
// QQ群: 135202158
方法1:将存有数据的字节数组进行逐位计算,求得字节形式的CRC
... {
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
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.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#]相关推荐
- 用Matlab比较三种求序列相关的方法
常规方法 用xcorr函数. 用filter函数 filter函数中,将分母设为1,则其结构就是乘累加,和相关一致.只不过这里要注意,求相关的时候,要将filter的系数b倒序. 用fft求序列相关 ...
- 三种求字符串长度的方法
目录 第一种:使用库函数strlen() 第二种:使用指针 第三种:使用递归的方式 第一种:使用库函数strlen() #include <stdio.h> #include <st ...
- 【数字图像处理】一种求图像边缘的方法
一幅图像,背景为黑色.其中有一个白色物体,其边缘连续.现在要求出其外边缘,即与黑色背景相交的部分,组成边缘线,并且由单个像素组成. 思想: 首先找到位于图像最上方的那个白色点. 然后从这个白色点(当前 ...
- 水仙花数java_Java三种求水仙花数的方法
水仙花数:水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:370=33+73+00:371=33+73+13,370.371就是一个水仙花数 注意:要判断一个三位数是不是水仙花数,得先 ...
- 【MATLAB】几种求矩阵伪逆的方法
几种求矩阵伪逆的方法 A*x=y当A不可逆如何解x 求伪逆有五种方法,左右同时乘以A','chol()分解,qr() 分解,svd()分解和pinv()求伪逆,下面来比较一下哪个最优秀. 如果A是个3 ...
- 无数种求逆元的方法总结
乘法逆元 对于缩系中的元素,每个数a均有唯一的与之对应的乘法逆元x,使得ax≡1(mod n) 一个数有逆元的充分必要条件是gcd(a,n)=1,此时逆元唯一存在 逆元的含义:模n意义下,1个数a如 ...
- 一种求周期二元线性序列的极小多项式的方法
一种求线性周期序列的极小多项式和线性复杂度的方法 前面说到了BM算法,这里再介绍一个求周期序列的线性复杂度的方法.本方法看起来似乎比Berlekamp-Massey算法(BM算法一般用于求有限长序列的 ...
- Matlab两种求相位的方法
在matlab中有两种求相位方法. 1.使用phase函数. 比如a = 1+j*2 phase(a),则可以就a的相位.这个函数取实部为x轴,虚部为y轴. 2.使用函数atan2. atan2(y, ...
- crc16的c语言函数 计算ccitt_使用C语言实现CRC校验的方法
CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理 ...
- 微带线特性阻抗计算公式_几种计算微带线特性阻抗的方法.pdf
几种计算微带线特性阻抗的方法 周刊 年第 期 ○信息技术教学与研究 2011 25 几种计算微带线特性阻抗的方法 段卓琦 大理学院 工程学院 云南 大理 ( , 671000 ) 摘 要 本文从不同的 ...
最新文章
- flutter中的路由跳转
- 4、jquery表格操作
- 智源论坛报名 | 智能信息检索与挖掘报告会(9月17日)
- Oracle 作业学习总结
- flash期末作业成品_基于“新工科”的工科物理作业模式研究
- 雌性激素过高怎么办?
- Android UI之ProgressBar
- Asp.Net_文件操作基类
- LoadRunner+Android模所器实现抓包并调试本地服务端
- shell学习过程中的错误集锦
- Java学习笔记--反射API
- echart水滴_echart 水滴图
- 再回顾SGX初始化(一)——环境检查
- 【物理学术竞赛】——绳上的球(再续)
- java 周次_JAVA计算学校学期周次
- IObit Driver Booster 无法更新驱动的解决办法
- 判断字符串不超过20个字符_如何阻止超过140个字符的推文(如果确实需要)
- 音视频开发——概述(含TUTK demo iOS)
- Vmware安装Centos及Linux的介绍,命令
- 计算机多媒体培训心得体会,学习计算机多媒体技术心得体会