为了防止数据在传输的时候丢失或被篡改,有了各种校验码。

每种CRC校验都有自己的多项式。每个多项式都有唯一对应的二进制。

CRC16就如果名字一样,校验码就是16位的 如果CRC32就是32位的。

原理就是  用一个数字(数据的二进制)去除一个特定的数字(多项式对应的二进制) 得到的余数就是CRC码。

检验的时候吧余数加入到原来的二进制中,若可以除的尽,则数据没有丢失。

下面是获取一个二进制数据的CRC16校验码的代码:

  1. private static void getCRC16(byte[] message, ref byte[] crc16)
  2. {
  3. ushort crcFull = 0xffff;               //寄存器初始化
  4. byte crcHigh = 0xff, crclow = 0xff;
  5. char crclast;
  6. for (int i = 0; i < message.Length; i++)     //把每一个字节都跑一次
  7. {
  8. crcFull = (ushort)(crcFull ^ message[i]);   //用来和寄存器的数组异或一下
  9. for (int j = 0; j < 8; j++)
  10. {
  11. crclast = (char)(crcFull & 0x0001);   //把每次最后一位保存下来
  12. crcFull = (ushort)((crcFull >> 1) & 0x7fff); //把最后一位排出去
  13. if (crclast == 1)                    //如果排除出去的是1 那么就要进行异或了
  14. crcFull ^= 0xA001;
  15. }
  16. }
  17. crc16[1] = crcHigh &= (byte)(crcFull >> 8);     //获取高八位的二进制
  18. crc16[0] = crclow &= (byte)crcFull;            //低八位
  19. }

校验:

  1. private static bool judgeCRC16(byte[] message)
  2. {
  3. ushort crcFull = 0xffff;
  4. char crclast;
  5. for(int i=0;i<message.Length;i++)
  6. {
  7. crcFull = (ushort)(crcFull ^ message[i]);
  8. for(int j=0;j<8;j++)
  9. {
  10. crclast =(char) (crcFull & 0x0001);
  11. crcFull = (ushort)((crcFull >> 1) & 0x7fff);
  12. if (crclast == 1)
  13. crcFull ^= 0xA001;
  14. }
  15. }
  16. //if (crcFull == 0) //0x0012>>8 = 0x0000
  17. //    return true;
  18. //else
  19. //    return false;
  20. return (crcFull == 0);
  21. }

水平有限,不服打我。

CRC循环校验码的更多相关文章

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

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

  2. CRC校验码

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

  3. 常用校验码(奇偶校验码、海明校验码、CRC校验码)

    一.奇偶校验码 二.海明校验码 三.CRC校验码   计算机系统运行时,各个部之间要进行数据交换.交换的过程中,会有发生误码的可能(即0变成1或1变成0),由于计算机的储存是通过二进制代码来实现的的, ...

  4. Modbus RTU CRC校验码计算方法

    在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算. CRC计算方法是: 1.  加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器. 2.   ...

  5. Modbus协议 CRC 校验码

    CRC(循环冗余校验)在线计算 http://www.ip33.com/crc.html 里面的8005的多项式值,但网上看到的算法都是用A001来异或的 ---------------------- ...

  6. hadoop-hdfs体系结构

    HDFS作为Hadoop的核心技术之一,HDFS(Hadoop Distributed File System, Hadoop分布式文件系统)是分布式计算中数据存储管理的基础.具有高容错高可靠性.高可 ...

  7. Hadoop之HDFS读写原理

    一.HDFS基本概念 HDFS全称是Hadoop Distributed System.HDFS是为以流的方式存取大文件而设计的.适用于几百MB,GB以及TB,并写一次读多次的场合.而对于低延时数据访 ...

  8. 校验码(海明校验,CRC冗余校验,奇偶校验)

    循环冗余校验码 CRC码利用生成多项式为k个数据位产生r个校验位进行编码,其编码长度为n=k+r所以又称 (n,k)码. CRC码广泛应用于数据通信领域和磁介质存储系统中. CRC理论非常复杂,一般书 ...

  9. CRC(Cyclic Redundancy Check)循环冗余校验码与海明码的计算题

    (17)采用CRC进行差错校验,生成多项式为G(X)=X4+X+1,信息码字为10111,则计算出的CRC校验码是  (17)  .A.0000  B.0100   C.0010   D.1100试题 ...

随机推荐

  1. apache 开启压缩功能

    apache如何开启压缩功能. 1,首先先确认是安装deflatte模块.如果未安装,可以重新编译apache添加参数--enable-deflate=shared ,或者扩展安装deflate模块, ...

  2. pl/sql连接远程服务器

    1.oracle提供了instantclient,下载instantclient-basic-win32-10.2.0.4.zip,将包解压存放到本地,如:D:\STUDY\instantclient ...

  3. jquery创建动态的div

    参考:http://blog.csdn.net/ge_zhiqiang/article/details/6958230

  4. Javascript进阶篇——(JS基础语法)笔记整理

    根据慕课网学习整理到一起的笔记,把东西整理到一起看起来比较方便 什么是变量字面意思:变量是可变的量:编程角度:变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品可 ...

  5. 如何在美国公司写project plan 邮件--以hadoop安装和Mahout数据分析为例子

    Hi, XXX (boss name) Project Title:  Hadoop installation and Data analysis based on Mahout Deliverabl ...

  6. sql server数据库主键自增一插入特定值

    ID identity(1,1) SET IDENTITY_INSERT TableName ON INSERT TableName(ID) VALUES(110) SET IDENTITY_INSE ...

  7. Json.Net序列化和反序列化设置

    首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一 ...

  8. Sql中的Exists和in

    最近学习数据库的分页算法,提到第一种 SELECT TOP 页大小 *FROM table1WHERE id NOT IN          (          SELECT TOP 页大小*(页数 ...

  9. iOS中的下载管理器(支持断点续传)

    在空闲时间自己编写了一个简单的iOS下载管理器.该管理器实现如下功能: 1.能够支持正常的下载,暂停,继续操作. 2.支持断点续传,实现暂停执行继续操作后,依然能正常将文件下载完成. 3.实现实时状态 ...

  10. C# 中的常用正则表达式大全

       这是从网上找来的,收藏一下备用,用到之处可以节省不少时间哦! 只能输入数字: "^[0-9]*$" . 只能输入n位的数字:"^\d{n}$". 只能输入 ...