C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包
由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复,对比通讯协议也没发现什么问题。由于文档有些不全,只是知道通讯格式,对比之后觉得应该是校验出了问题。由于CRC校验是数据通信领域最常用的校验方式,问了几个老家伙之后才知道这个四字节ASCII码校验和应该是CRC16-CCITT生成的,然后就去仔细看大学时候煞笔了很久也没明白的CRC校验的细节。
具体CRC如何生成我不阐述了,关键点在于“生成多项式”和初始值。
CRC16-CCITT的生成多项式是 0x1021;
不多说了,提供代码CRC16-CCITT类
public class Crc16Ccitt
{
public enum InitialCrcValue { Zeros, NonZero1 = 0xffff, NonZero2 = 0x1D0F }
const ushort poly = ;
ushort[] table = new ushort[];
ushort initialValue = ; public Crc16Ccitt(InitialCrcValue initialValue)
{
this.initialValue = (ushort)initialValue;
ushort temp, a;
for (int i = ; i < table.Length; ++i)
{
temp = ;
a = (ushort)(i << );
for (int j = ; j < ; ++j)
{
if (((temp ^ a) & 0x8000) != )
{
temp = (ushort)((temp << ) ^ poly);
}
else
{
temp <<= ;
}
a <<= ;
}
table[i] = temp;
}
} public ushort ComputeChecksum(byte[] bytes)
{
ushort crc = this.initialValue;
for (int i = ; i < bytes.Length; ++i)
{
crc = (ushort)((crc << ) ^ table[((crc >> ) ^ (0xff & bytes[i]))]);
}
return crc;
} public ushort ComputeChecksum(List<byte> listTemp)
{
byte[] bytes = listToBytes(listTemp);
ushort crc = this.initialValue;
for (int i = ; i < bytes.Length; ++i)
{
crc = (ushort)((crc << ) ^ table[((crc >> ) ^ (0xff & bytes[i]))]);
}
return crc;
} public byte[] ComputeChecksumBytes(byte[] bytes)
{
ushort crc = ComputeChecksum(bytes);
return BitConverter.GetBytes(crc);
} public byte[] listToBytes(List<byte> listTemp)
{
int length = listTemp.Count();
byte[] bytes = new byte[length];
for (int i = ; i < length; i++)
{
bytes[i] = listTemp[i];
}
return bytes;
}
}
最后,请叫我红领巾
C# CRC校验的一点感悟的更多相关文章
- CRC校验源码分析
这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...
- CRC校验原理和verilog实现方法(一)
1.CRC简介 CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常用的检错方法,用于保证数据传输的可靠性.网上有关这方面的博客和资料很多,本 ...
- CRC校验原理和verilog实现方法(二)
1 前言 在 前面的博客 CRC校验原理和verilog实现方法(一) 中,介绍了CRC校验的原理和手动计算过程.本文说一下我在学习CRC校验FPGA实现的一点心得体会. 2 线性反馈移位寄存器 ...
- 文档:网络通讯包结构(crc校验,加解密)
一直想把这个流程整理一下. 包结构: 包 对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到 对(数据内容)进行crc计算而得到 协议号 数据内容的字节长度 ...
- CRC校验码原理、实例、手动计算
目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...
- 物联网平台设计心得:你所不知道的CRC校验
在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...
- CRC校验代码实现
1.CRC校验简介 CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”.CRC校验是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...
- CRC校验码
循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...
- 在线CRC校验
在线CRC校验: http://www.lammertbies.nl/comm/info/crc-calculation.html
随机推荐
- codeforce
A. Playing with Dice time limit per test 1 second memory limit per test 256 megabytes input standard ...
- MySQL的YEARWEEK函数(转)
MySQL的YEARWEEK函数以及查询本周数据 2013-03-10 16:45:10 我来说两句 作者:kamuikyo 收藏 我要投稿 MySQL的YEARWEEK函数以 ...
- Linux C 编译错误总结
1. test.c:59:5: warning: incompatible implicit declaration of built-in function ‘memset’ [enabled by ...
- WPP
WPP(Wavefront Parallel Processing) 上一行的第二个LCU处理完毕,即对当前行的第一个LCU的熵编码(CABAC)概率状态参数进行初始化,如图5所示.因此,只需要上一行 ...
- MAC 下安装PIL
1. 安装使用 pip install pil 结果报如下错误 Collecting PIL Could not find a version that satisfies the requireme ...
- Ajax提交打开新窗口,浏览器拦截处理
//主要是添加同步处理 $.ajax({ url: "ashx/OrderHander.ashx?action=CheckRepeat", data: { "OrderI ...
- 【转】G40-70、G50-70联想小新笔记本SR1000随机Linux改Windows 7系统操作指导
http://support1.lenovo.com.cn/lenovo/wsi/htmls/detail_20140505150749705.html 适用范围:G40-70,G50-70联想小新笔 ...
- 怎样在win7下装ubuntu(硬盘版安装)
1)首先还是分区,在计算机上右键--管理--磁盘管理 装Ubuntu分配的硬盘大小最好是(20G以上)不要太小,这里请注意,ubuntu和windows文件系统全然不同,所以我们划好要给ubuntu的 ...
- UML要点总结(一)
UML中的事物 UML事物包含结构事物.行为事物.组织事物和辅助事物. 结构事物: 类.接口.用例.协作.活动类.组件和节点. 行为事物: 也称动作事物,交互和状态机. 组织事物: 也称分组事物,仅仅 ...
- ExtJS笔记--applyTo和renderTo的差别
extjs中常常会用到renderTo或applyTo配置选项.这里,我就比較下两者的差别与使用方法.1.renderTo与render方法相应2.applyTo与applyToMarkup方法相应 ...