JAVA CRC-16(CRC-16/IBM)计算校验值

前言:对接硬件设备的通信协议需要用到CRC-16进行计算校验值,然后再网上找了很多个版本,很久都没找到这个版本的,然后好不容易找到了,就记录一下

注意:
这个是CRC-16(CRC-16/IBM)的版本,不是CRC-16/MODBUS或其他版本,如果想要其他版本可以另外搜索

代码如下:

public class CRC16Utils {/*** CRC-16 校验* 低位在前高位在后* @param data* @return*/public static byte[] getCRCBytes(byte[] data) {int crc = 0x0000;for (byte b : data) {crc = (crc >>> 8) ^ table[(crc ^ b) & 0xff];}return new byte[] { (byte) (0xff & crc), (byte) ((0xff00 & crc) >> 8) };}private static final int[] table = { 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741,0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40,0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40,0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341,0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740,0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41,0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41,0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340,0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740,0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41,0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41,0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340,0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741,0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40,0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40,0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341,0x4100, 0x81C1, 0x8081, 0x4040, };/*** @brief 字节数组转为十六进制字符串* @param src 字节数组* @return 字符串*/public static String bytesToHexString(byte[] src) {StringBuilder stringBuilder = new StringBuilder("");if (src == null || src.length <= 0) {return null;}for (int i = 0; i < src.length; i++) {int v = src[i] & 0xFF;// System.out.println(v);String hv = Integer.toHexString(v);if (hv.length() < 2) {stringBuilder.append(0);}stringBuilder.append(hv);}return stringBuilder.toString();}//测试public static void main(String[] args) {byte[] baotou_date = {0x01,0x00,0x00,(byte)0x80,0x00,0x00,0x00,0x00,0x00,0x00,(byte)0xFE,0x02,(byte)0x0E,0x00,(byte)0xA1,0x05,0x01,0x00,0x00,0x01,0x50,0x30,0x30,0x30,0x49,0x00,0x00,0x00};byte[] crcBytes = getCRCBytes(baotou_date);System.out.println(bytesToHexString(crcBytes));}
}

输出的结果:

可以找一个在线CRC校验工具验证一下
地址: http://www.metools.info/code/c15.html.

JAVA CRC-16(CRC-16/IBM)计算校验值相关推荐

  1. 快速计算文件的MD5/SHA1/SHA256等校验值(Windows/Linux)

    从网络上下载文件,尤其是非常大的文件怎么确保文件准确无误呢? 通常网站提供文件时会同时提供该文件的校验值,如MD5,SHA1,SHA256等, 当文件下载完成后,计算它的校验值,如果和网站提供的一致, ...

  2. 校验值的计算----移位算法

    一直以来都是从互联网获得知识,感觉没贡献过什么. 最近做项目研究了一个算法,就写一个共享出来,给需要的人一些参考. 说明: 有一个40字节的数组,前38个字节表示数据,后两个字节表示校验值. 校验值是 ...

  3. java modbus crc_modbus crc计算工具(Modbus CRC校验工具)

    CRC-16(循环冗余错误校验) 冗余循环码(CRC)包含2个字节,即16位二进制.CRC码由发送设备计算,放置于发送信息的尾部.接收信息的设备再重新计算接收到信息的CRC码,比较计算得到的CRC码是 ...

  4. Java中的CRC校验

    前言 最近客户有CRC校验的需求,即希望Android端对字符串进行校验,并将生成的2个字节的CRC校验码追加到字符串中,然后一起写入文件.当系统联网后,会通过写入的字符串去向服务器请求设备序列号,服 ...

  5. CRC校验值是如何计算出来的?

    本文在我已在知乎发过地址-->addr 最近用到CRC-16/CCITT-FALSE算法校验,找了很多资料, 发现代码和线上校验的值对不上,所以花了时间深入了解其原理,并 将 CRC-8/CRC ...

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

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

  7. Java技术:收集16 条 yyds 的代码规范,值得一读!

    今天给大家分享关于Java技术中16 条 yyds 的代码规范,读完肯定会有帮助! 一.MyBatis 不要为了多个查询条件而写 1 = 1 当遇到多个查询条件,使用where 1=1 可以很方便的解 ...

  8. 云计算与大数据第16章 分布式内存计算平台Spark习题

    第16章 分布式内存计算平台Spark习题 16.1 选择题 1.Spark是Hadoop生态(  B  )组件的替代方案. A. Hadoop     B. MapReduce        C. ...

  9. java 对话框计算器,《Java程序设计》第16周礼拜四:GUI编程及文件对话框的使用 计算器...

    <Java程序设计>第16周周四:GUI编程及文件对话框的使用 计算器 项目三:实验六 图形用户界面(教材P279-280) 目标:完成实验六的内容. 运行代码 import java.a ...

最新文章

  1. Cannot locate BeanDefinitionParser for element [scoped-proxy]
  2. PTA 基础编程题目集 7-20 打印九九口诀表 C语言
  3. linux ls命令 --time-style选项 日期时间格式控制
  4. ActiveX (.ocx)的写法,及在IE里调用
  5. 0.0 目录-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  6. Windows环境下maven 安装与环境变量配置
  7. opengl 关于glewGetContext没有定义
  8. HTML5自定义数据属性data-*
  9. Linux 下mysql操作
  10. EEGLAB教程-1.2通道定位
  11. 国内财务软件公司排名
  12. Linux系统进程优化理论与方法
  13. windows截图指令命令/cmd中截图指令
  14. Java json字符串转json对象
  15. 西门子PLC配KUKA机器人程序 程序为西门子S7-1500PLC博途调试
  16. 微信公众平台开发调试
  17. web安全从基础术语、windows/linux基础到安全漏洞/病毒木马挖掘与分析利用(持续更新)
  18. java基于springboot+vue的旧衣服捐赠系统 毕业设计nodejs技术
  19. 路由与交换-华为eNSP-交换机上配置DHCP技术
  20. sql计算除法保留两位小数

热门文章

  1. 怎样修改带密码的还原精灵
  2. frontpage 2003动态html效果,FrontPage 2003网页编辑小技巧
  3. FTP客户端和服务器的设计与实现
  4. PJblog皮肤模版制作说明-皮肤结构CSS
  5. 又遇:只有偏执狂才能生存
  6. 网络语言为你打c,“想打定话给你”是什么梗
  7. idea踩坑之-配置文件错误(source code does not match the bytecode )
  8. as死机了怎么办_电脑老是莫名其妙地死机,怎么办?
  9. 【Java学习笔记】一个初学者的学习历程,分享学习JAVA心得
  10. mt7620a上带机量的提高(一)