今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包

由于之前公司产品在校验时基本上都是和校验,今天在准备用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校验的一点感悟的更多相关文章

  1. CRC校验源码分析

    这两天做项目,需要用到 CRC 校验.以前没搞过这东东,以为挺简单的.结果看看别人提供的汇编源程序,居然看不懂.花了两天时间研究了一下 CRC 校验,希望我写的这点东西能够帮助和我有同样困惑的朋友节省 ...

  2. 文档:网络通讯包结构(crc校验,加解密)

    一直想把这个流程整理一下. 包结构: 包 对(datacrc+protoID+dataSize)组成的byte[] 进行crc计算而得到 对(数据内容)进行crc计算而得到 协议号 数据内容的字节长度 ...

  3. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  4. 物联网平台设计心得:你所不知道的CRC校验

    在物联网平台设计过程中,我的中间件一方面需要处理来自于硬件端的包,另一方面需要处理来自于用户端的包,用户端包括web端和手机端等等.所以编写一个统一的CRC认证是非常必须要. 那么,在设计开始,CRC ...

  5. CRC校验代码实现

    1.CRC校验简介 CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”.CRC校验是数据通讯中最常采用的校验方式.在嵌入式软件开发中,经常要 ...

  6. CRC校验码

    循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码.对于一个给定的(N,K)码,可以证明存在一个最高次幂为R的多项式G(x)(R ...

  7. 在线CRC校验

    在线CRC校验: http://www.lammertbies.nl/comm/info/crc-calculation.html

  8. CRC校验

    小试一下CRC校验的verilog实现,采用最stupid的直接法. /* date : 2014/06/06 designer : pengxiaoen virsion : Altera-Model ...

  9. 网络通信 --&gt; CRC校验

    CRC校验 一.什么是CRC校验     循环校验码(Jyclic Redundancy Check,简称CRC码): 是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意 ...

随机推荐

  1. UWP/Win10新特性系列—Drag&amp;Drop 拖动打开文件

    在Win10 App开发中,微软新增了系统PC文件与UWP 之间的文件拖拽行为,它支持将系统磁盘上的文件以拖拽的形式拖入App中并处理,在前不久的微软build 2015开发者大会上微软展示的UWP版 ...

  2. error: src refspec master does not match any. 错误处理办法

    自从上次学了git之后,很少用.今天在使用 本地仓库使用如下命令初始化: $ git init 之后使用如下命令添加远程库: $ git remote add origin git@github.co ...

  3. 低功耗蓝牙4.0BLE编程-nrf51822开发(9)

    Android 4.3以后的系统自动支持蓝牙4.0规范的低功耗蓝牙(BLE).在android4.3之前,蓝牙4.0支持是由手机厂家加入支持的,接口各异,导致开发一个支持蓝牙4.0程序支持市面上的手机 ...

  4. Android ListView使用(非原创)

    1.ListView:它以列表的形式展示具体要显示的内容,并且能够根据数据的长度自适应屏幕显示 <LinearLayout xmlns:android="http://schemas. ...

  5. socket基础示例(一)

    //Socket基本编程 //服务端: using System.Net; using System.Net.Sockets; using System.Text; using System.Thre ...

  6. libCurl的文件上传

    最近在需要使用curl的上传功能,使用libCurl来实现.因此,先使用curl命令操作,然后再使用libCurl实现. 基于Http协议的文件上传的标准方法是: 基于POST Form的文件上传  ...

  7. xtrabackup在线备份及还原

    xtrabackup下载https://www.percona.com/downloads/XtraBackup/LATEST/xtrabackup文档https://www.percona.com/ ...

  8. Chrome浏览器扩展开发系列之十九:扩展开发示例

    翻译总结了这么多的官网内容,下面以一款博主开发的“沪深股票价格变化实时追踪提醒”软件为例,介绍Chrome浏览器扩展程序的开发,开发环境为Eclipse IDE+Chrome Browser. “沪深 ...

  9. c#使用PortableDeviceApiLib读取便携式设备(WPD:Windows Portable Devices)信息

    相关名词解释: WPD( Windows Portable Devices) 译作Windows 便携设备 (WPD) 是一种驱动程序技术,可支持广泛的可移动设备,比如移动电话.数码相机和便携媒体播放 ...

  10. 002 如何在一台PC上装两个版本的python

    在之前学习爬虫的时候,使用的是python2.7,现在主流已经是3.7了. 在这里,写了一下如何在2.7的基础上安装python3.6 一:检查python版本 1.cmd 二:安装python3 1 ...