CRC16校验

最近开发有用到CRC16校验,但是网上普遍是CRC-16/MODBUS的,项目上使用的是CRC-16/X25,只有MODBUS例子可以参考,但是对其中几个参数以及这两种算法有什么区别不是很明白,因此查找了关于crc16的相关内容,之后终于明白了其中一个关键的参数,特此做下记录。用了网上代码的直接生成法

感谢该网友上传的js的crc16校验代码
http://download.csdn.net/download/oukunqing/9553070#comment

一些crc算法
https://www.cnblogs.com/ayxj/p/11481969.html

crc16检验 C#
https://www.cnblogs.com/oukunqing/p/5820640.html

crc16在线检验工具
http://www.ip33.com/crc.html
里面有完整的各种多项式版本的校验算法,以及各个之间的区别
小程序中js的CRC=代码如下

 var CRC = {};CRC.CRC16 = function (data) {
var len = data.length;
if (len > 0) {
var crc = 0xFFFF;      //初始值for (var i = 0; i < len; i++) {
crc = (crc ^ (data[i]));
for (var j = 0; j < 8; j++) {
crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0x8408) : (crc >> 1);     //0x8408 由来见代码结尾
}
}
crc = crc ^ 0xFFFF       //结果异或
var hi = ((crc & 0xFF00) >> 8); //高位置
var lo = (crc & 0x00FF); //低位置return [hi, lo];
}
return [0, 0];
};CRC.isArray = function (arr) {
return Object.prototype.toString.call(arr) === '[object Array]';
};CRC.ToCRC16 = function (str, isReverse) {
return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse);
};CRC.ToModbusCRC16 = function (str, isReverse) {
return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse);
};CRC.strToByte = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var j = encodeURI(tmp[i]);
if (j.length == 1) {
arr.push(j.charCodeAt());
} else {
var b = j.split('%');
for (var m = 1; m < b.length; m++) {
arr.push(parseInt('0x' + b[m]));
}
}
}
return arr;
};CRC.convertChinese = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var s = tmp[i].charCodeAt();
if (s <= 0 || s >= 127) {
arr.push(s.toString(16));
}
else {
arr.push(tmp[i]);
}
}
return arr;
};CRC.filterChinese = function (str) {
var tmp = str.split(''), arr = [];
for (var i = 0, c = tmp.length; i < c; i++) {
var s = tmp[i].charCodeAt();
if (s > 0 && s < 127) {
arr.push(tmp[i]);
}
}
return arr;
};CRC.strToHex = function (hex, isFilterChinese) {
hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join('');//清除所有空格
hex = hex.replace(/\s/g, "");
//若字符个数为奇数,补一个空格
hex += hex.length % 2 != 0 ? " " : "";var c = hex.length / 2, arr = [];
for (var i = 0; i < c; i++) {
arr.push(parseInt(hex.substr(i * 2, 2), 16));
}
return arr;
};CRC.padLeft = function (s, w, pc) {
if (pc == undefined) {
pc = '0';
}
for (var i = 0, c = w - s.length; i < c; i++) {
s = pc + s;
}
return s;
};CRC.toString = function (arr, isReverse) {
if (typeof isReverse == 'undefined') {
isReverse = true;
}
var hi = arr[0], lo = arr[1];
return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0');
};

C# CRC 代码如下

   public static byte[] CRC1625(byte[] dataBytes){string str = "";int len = dataBytes.Length;if (len > 0){var crc = 0xffff;   //①for (int i = 0; i < len; i++){crc = (crc ^ (dataBytes[i]));for (int j = 0; j < 8; j++){crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0x8408) : (crc >> 1);   //②}}crc = crc ^ 0xffff;   //③var hi = ((crc & 0xFF00) >> 8);var lo = ((crc & 0x00ff));str = hi.ToString("X2") + lo.ToString("X2");}return Encoding.UTF8.GetBytes(str);}

说明
① 根据 crc16在线检验工具 获得初始值

② CRC-16/X25算法 多项式x16+x12+x5+1 (表示第16位12位5位第0位位1,位从0起) 即0001 0001 0000 0010 0001 去掉高位0001 后转换十六进制为1021
1021即为多项式简写
同时对转换成二进制的多项式去高位并反转得到 1000 0100 0000 1000 转换成十六进制为 8408

CRC-16/USB算法 x16+x15+x2+1 表示第16位15位2位第0位位1,位从0起) 即0001 1000 0000 0000 0101 去掉高位0001 后转换十六进制为8005
8005即为多项式简写
同时对转换成二进制的多项式去高位并反转得到 1010 0000 0000 0001转换成十六进制为 A001

③根据 crc16在线检验工具 获得结果异或值

CRC16校验使用体验相关推荐

  1. crc16检验 python_Python CRC16校验算法

    def crc16(x, invert): a = 0xFFFF b = 0xA001 for byte in x: a ^= ord(byte) for i in range(8): last = ...

  2. crc16算法php实现,关于实现CRC16校验算法的两个函数

    之前在2017年2月份发布过一个主题,也是关于CRC16的,现在我直接把函数写出来,希望能帮到有需要的朋友.对于在线监测设备数据传输标准来说,CRC16校验算法有基于通用modbus协议的,有基于环保 ...

  3. php crc16校验算法,PHP串口通信中计算crc16校验码

    最近使用PHP开发串口通信业务,在发送485Modbus命令时,基本都要计算CRC16校验码.网上搜索了很多文章,很多都计算的不对.本文记录搜索到的正确的计算方法. 代码如下:/** * crc16计 ...

  4. PHP CRC16 校验码的算法怎么使用

    PHP CRC16 校验码的算法如何使用 最近用到CRC16, 我现在就是要把 010301180001 算出CRC16的校验码,通过其他工具,可以得到 校验码是 05F1 最后完整的代码就是 010 ...

  5. 最详细易懂的CRC-16校验原理(附源程序)

    from:http://www.openhw.org/chudonganjin/blog/12-08/230184_515e6.html 最详细易懂的CRC-16校验原理(附源程序) 1.循环校验码( ...

  6. CRC-16校验C#代码

    [csharp] view plaincopyprint? using System; using System.Collections.Generic; using System.Text; usi ...

  7. java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

    ModBus 的Crc16校验 package testCase; public class CRC16M { static final String HEXES = "0123456789 ...

  8. 蓝牙:CRC原理详解(附crc16校验代码)

    CRC原理详解(附crc16校验代码) 参考链接: https://www.cnblogs.com/esestt/archive/2007/08/09/848856.html Cyclic Redun ...

  9. CRC-16校验(多项式为x16+x15+x2+1):

    CRC-16校验(多项式为x16+x15+x2+1): type {CRC校验} TDataByte = array of byte; const        CRCHi: array [0..25 ...

最新文章

  1. 手把手教你玩转网络编程模型之完成例程(Completion Routine)
  2. bugly中批量隐藏版本
  3. 共享锁、排他锁、互斥锁、悲观锁、乐观锁、行锁、表锁、页面锁、不可重复读、丢失修改、读脏数据...
  4. java中isa什么意思_ISA是什么?
  5. windows libusb打开失败_如何彻底解决windows更新问题!
  6. Property Bags Object Model中的小“陷阱”
  7. An error has occured.See the log file
  8. 内大计算机学院研究生奖学金,计算机学院2020级硕士研究生学业奖学金评审结果公示...
  9. 计算机表格怎么同时选中分开的两项,excel怎么把三个单元格分成两个
  10. 移动物联网卡助力智慧医疗 打造新型医疗体系
  11. python学习之文字转换为语音读出来
  12. 实战APP微信支付服务商模式(一个APP多个商户收款)
  13. poi-tl——Word模板引擎应用
  14. 一些计时软件,生产力工具
  15. 【上电即上华为云】华为云AIoT智联开发板_mcu_HK32F103Vx
  16. 深搜广搜专题【DFS】【BFS】
  17. 程序猿开发大牛成长记 | 龙果社区有奖征文活动
  18. ME909S-821 4G-LTE模块在Linux系统下拨号上网测试
  19. antd组件库封装44-添加字体变量方案
  20. too much recursion

热门文章

  1. 生成组合对象的算法——Johnson-Trotter算法的python实现
  2. Linux命令之修改用户账户usermod
  3. C++ OpenCV(一):图像读取与保存
  4. 【GAOPS050】自同步加扰和帧同步加扰
  5. C·cJSON库函数--cJSON_GetObjectItem
  6. 认识(大端--小端)端模式
  7. log4 日志级别使用
  8. 万物皆游戏,设计大时髦
  9. PS2018学习笔记(03-18节)
  10. DBeaver:开源、跨平台、强大的数据库管理工具