原文链接:http://blog.csdn.net/qq_26440221/article/details/66480657

最近在搞关于手环的APP,到蓝牙通讯这里是私有协议,用到了CRC校验(循环冗余校验),APP作为接收端需要实现CRC算法。在网上看了很多大神的文章,我看了感觉不是很清晰,故写此博客。

这是在网上找的CRC计算软件: CRC校验码计算软件,可以用作测试值是否正确。 首先百度了下CRC,这是百度的内容,一般的校验方法有:1.奇偶校验;2.因特网校验;3.循环冗余校验。使用领域:在数据存储、数据通讯领域,CRC无处不在。作用:检测数据是否正确,CRC只能检错不能纠错。定义:Cyclic Redundancy Check循环冗余校验,是基于数据计算一组校验码,用于核对数据传输过程中是否被更改或传输错误。它是利用除法及余数的原理来作错误侦测的。

算法原理: (可以先看完本文,再去百度,讲的很详细)

用Java语言实现的 测试类Crc_16_CCITT_FALSE工具包如下:

测试数据:AA 0C 01 00 01 00 00 04 05 17 05 01 A0 86 01 00

结果为:F2E3

CRC校验码计算软件:

CRC16工具类:

/**** CRC数组处理工具类及数组合并*/
public class CrcUtil {/*** 为Byte数组最后添加两位CRC校验* @param buf(验证的byte数组)* @return*/public static byte[] setParamCRC(byte[] buf) {int checkCode = 0;checkCode = crc_16_CCITT_False(buf, buf.length);byte[] crcByte = new byte[2];crcByte[0] = (byte) ((checkCode >> 8) & 0xff);crcByte[1] = (byte) (checkCode & 0xff);// 将新生成的byte数组添加到原数据结尾并返回return concatAll(buf, crcByte);}/*** CRC-16/CCITT-FALSE x16+x12+x5+1 算法** info* Name:CRC-16/CCITT-FAI* Width:16* Poly:0x1021* Init:0xFFFF* RefIn:False* RefOut:False* XorOut:0x0000* @param bytes* @param length* @return*/public static int crc_16_CCITT_False(byte[] bytes, int length) {int crc = 0xffff; // initial valueint polynomial = 0x1021; // poly valuefor (int index = 0; index < bytes.length; index++) {byte b = bytes[index];for (int i = 0; i < 8; i++) {boolean bit = ((b >> (7 - i) & 1) == 1);boolean c15 = ((crc >> 15 & 1) == 1);crc <<= 1;if (c15 ^ bit)crc ^= polynomial;}}crc &= 0xffff;//输出String字样的16进制String strCrc = Integer.toHexString(crc).toUpperCase(); System.out.println(strCrc);return crc;}/**** CRC校验是否通过* @param srcByte* @param length(验证码字节长度)* @return*/public static boolean isPassCRC(byte[] srcByte, int length) {// 取出除crc校验位的其他数组,进行计算,得到CRC校验结果int calcCRC = calcCRC(srcByte, 0, srcByte.length - length);byte[] bytes = new byte[2];bytes[0] = (byte) ((calcCRC >> 8) & 0xff);bytes[1] = (byte) (calcCRC & 0xff);// 取出CRC校验位,进行计算int i = srcByte.length;byte[] b = { srcByte[i - 2] ,srcByte[i - 1] };// 比较return bytes[0] == b[0] && bytes[1] == b[1];}/*** 对buf中offset以前crcLen长度的字节作crc校验,返回校验结果* @param  buf* @param crcLen*/private static int calcCRC(byte[] buf, int offset, int crcLen) {int start = offset;int end = offset + crcLen;int crc = 0xffff; // initial valueint polynomial = 0x1021;for (int index = start; index < end; index++) {byte b = buf[index];for (int i = 0; i < 8; i++) {boolean bit = ((b >> (7 - i) & 1) == 1);boolean c15 = ((crc >> 15 & 1) == 1);crc <<= 1;if (c15 ^ bit)crc ^= polynomial;}}crc &= 0xffff;return crc;}/*** 多个数组合并** @param first* @param rest* @return*/public static byte[] concatAll(byte[] first, byte[]... rest) {int totalLength = first.length;for (byte[] array : rest) {totalLength += array.length;}byte[] result = Arrays.copyOf(first, totalLength);int offset = first.length;for (byte[] array : rest) {System.arraycopy(array, 0, result, offset, array.length);offset += array.length;}return result;}
}

测试类:

/*** 测试类*/
public class Test {//测试数据static byte[] data = {(byte)0xAA,0x0C,0x01,0x00,0x01,0x00,0x00,0x04,0x05,0x17,0x05,0x01,(byte)0xA0,(byte)0x86,0x01,0x00};//AA 0C 01 00 01 00 00 04 05 17 05 01 A0 86 01 00 //结果为:F2E3public static void main(String[] s){byte[] crcData = CrcUtil.setParamCRC(data);if(CrcUtil.isPassCRC(crcData, 2)){System.out.println("验证通过");}else{System.out.println("验证失败");}}
}

Java实现CRC16CCITT算法相关推荐

  1. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  2. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  3. Java常见排序算法

    Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html

  4. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  5. JAVA版连连看算法研究

    JAVA连连看之算法: 连连看连接方式的类型:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:off ...

  6. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  7. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  8. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  9. java基础----Base64算法的使用

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息.详细的Base64信息,可以参见维基百科:https://en.wikipedia.org ...

最新文章

  1. 让智能手机和居家电脑互联互通(WM6 GPRS)
  2. ubuntu14.04系统扩容的方法
  3. 【 Notes 】COMPARISON OF BASIC METHODS AND POSITIONING SYSTEMS
  4. c++文件中引用C代码
  5. 一次实现可以在某些场合替代菱形继承?
  6. Android滑屏 mScrollX mScrollY scrollTo() scrollBy()
  7. Spring Mobile 1.1.0.RC1 和 1.0.2 发布
  8. java中什么是 伪共享_【Java】聊聊多线程中的伪共享现象
  9. SSM集成Mybatis和Druid
  10. 培生同意以3亿美元出售华尔街英语
  11. 如何查询Linux软件安装源,Zypper——suse软件查询 安装 升级 与 软件源编辑
  12. Mac本换ssd注意事项
  13. 电脑技巧:Win10操作系统关闭这几个功能,可以大幅度提升电脑的运行速度
  14. 在计算机中添加用户时提示拒绝访问,教你怎么解决打印机拒绝访问问题
  15. 对堆区、栈区、全局静态区的理解
  16. 不是maf格式的somatic突变数据就没办法读入到maftools了么
  17. 中央电教馆虚拟实验服务器,中央电化教育馆中小学虚拟实验试点工作启动暨培训会侧记...
  18. 关于IE、Firefox、Opera页面呈现异同 (转于纯蓝)
  19. 数据结构学习,哈希表(链地址)
  20. 工业通讯领域的总线、协议、规范、接口、数据采集与控制系统

热门文章

  1. 从源码看DL4J中Native BLAS的加载,以及配置
  2. 计算机专业本科硕士博士连读,直博、硕博连读、本硕博连读、考博到底啥区别,学姐给你解释明白...
  3. 2021-2027全球与中国单质肥料市场现状及未来发展趋势
  4. win10组件服务计算机是红色的,今天发现组件服务中我的电脑有个红色向下箭头,同时com+报错无法与MSDTC交流...
  5. 【Springboot + Vue 视频播放web项目】解决视频播放只有声音没有画面
  6. GitHub 和 Gitee 开源免费 10 个超赞后台管理面板,看完惊呆了!
  7. Python爬虫入门教程09:多线程爬取表情包图片
  8. 【面经】【经验分享】研究生导师是路桑,找工作是一种什么样的体验?
  9. 如何设计出好的少儿编程课程?
  10. 排序二叉树节点的删除