CRC-16/X25、CRC-16/CCITT_FALSE、CRC-16/XMODEM校验码

article/2025/10/31 4:59:15

      这几天做北斗定位设备的协议解析,需要进行CRC-16的校验,设备使用的参数模型是CRC-16/X25,本人使用的是Java语言,网上没找到关于CRC-16/X25 的Java版本,都是C语言的多。转换一下记录在这里,方便以后使用。CRC-16/CCITT_FALSE是引用其它网络文章的,已经忘记在哪里。

       在线CRC工具有:http://www.ip33.com/crc.html。

package com.huan.utils;/*** 查表法生成CRC校验码,支持的参数模型为CRC-16/X25校验码* 计算法生成CRC校验码,支持的两个参数模型为CRC-16/CCITT_FALSE、CRC-16/XMODEM* * * @date 2018年5月31日 上午11:26:21* @author huan* @since version*/
public class CRCUtil {private static int crc16_ccitt_table[] = { 0X0000, 0X1189, 0X2312, 0X329B, 0X4624, 0X57AD, 0X6536, 0X74BF, 0X8C48, 0X9DC1, 0XAF5A, 0XBED3, 0XCA6C, 0XDBE5, 0XE97E, 0XF8F7, 0X1081, 0X0108, 0X3393, 0X221A, 0X56A5, 0X472C, 0X75B7, 0X643E, 0X9CC9, 0X8D40, 0XBFDB, 0XAE52, 0XDAED, 0XCB64, 0XF9FF, 0XE876, 0X2102, 0X308B, 0X0210, 0X1399, 0X6726, 0X76AF, 0X4434, 0X55BD, 0XAD4A, 0XBCC3, 0X8E58, 0X9FD1, 0XEB6E, 0XFAE7, 0XC87C, 0XD9F5, 0X3183, 0X200A, 0X1291, 0X0318, 0X77A7, 0X662E, 0X54B5, 0X453C, 0XBDCB, 0XAC42, 0X9ED9, 0X8F50, 0XFBEF, 0XEA66, 0XD8FD, 0XC974, 0X4204, 0X538D, 0X6116, 0X709F, 0X0420, 0X15A9, 0X2732, 0X36BB, 0XCE4C, 0XDFC5, 0XED5E, 0XFCD7, 0X8868, 0X99E1, 0XAB7A, 0XBAF3, 0X5285, 0X430C, 0X7197, 0X601E, 0X14A1, 0X0528, 0X37B3, 0X263A, 0XDECD, 0XCF44, 0XFDDF, 0XEC56, 0X98E9, 0X8960, 0XBBFB, 0XAA72, 0X6306, 0X728F, 0X4014, 0X519D, 0X2522, 0X34AB, 0X0630, 0X17B9, 0XEF4E, 0XFEC7, 0XCC5C, 0XDDD5, 0XA96A, 0XB8E3, 0X8A78, 0X9BF1, 0X7387, 0X620E, 0X5095, 0X411C, 0X35A3, 0X242A, 0X16B1, 0X0738, 0XFFCF, 0XEE46, 0XDCDD, 0XCD54, 0XB9EB, 0XA862, 0X9AF9, 0X8B70, 0X8408, 0X9581, 0XA71A, 0XB693, 0XC22C, 0XD3A5, 0XE13E, 0XF0B7, 0X0840, 0X19C9, 0X2B52, 0X3ADB, 0X4E64, 0X5FED, 0X6D76, 0X7CFF, 0X9489, 0X8500, 0XB79B, 0XA612, 0XD2AD, 0XC324, 0XF1BF, 0XE036, 0X18C1, 0X0948, 0X3BD3, 0X2A5A, 0X5EE5, 0X4F6C, 0X7DF7, 0X6C7E, 0XA50A, 0XB483, 0X8618, 0X9791, 0XE32E, 0XF2A7, 0XC03C, 0XD1B5, 0X2942, 0X38CB, 0X0A50, 0X1BD9, 0X6F66, 0X7EEF, 0X4C74, 0X5DFD, 0XB58B, 0XA402, 0X9699, 0X8710, 0XF3AF, 0XE226, 0XD0BD, 0XC134, 0X39C3, 0X284A, 0X1AD1, 0X0B58, 0X7FE7, 0X6E6E, 0X5CF5, 0X4D7C, 0XC60C, 0XD785, 0XE51E, 0XF497, 0X8028, 0X91A1, 0XA33A, 0XB2B3, 0X4A44, 0X5BCD, 0X6956, 0X78DF, 0X0C60, 0X1DE9, 0X2F72, 0X3EFB, 0XD68D, 0XC704, 0XF59F, 0XE416, 0X90A9, 0X8120, 0XB3BB, 0XA232, 0X5AC5, 0X4B4C, 0X79D7, 0X685E, 0X1CE1, 0X0D68, 0X3FF3, 0X2E7A, 0XE70E, 0XF687, 0XC41C, 0XD595, 0XA12A, 0XB0A3, 0X8238, 0X93B1, 0X6B46, 0X7ACF, 0X4854, 0X59DD, 0X2D62, 0X3CEB, 0X0E70, 0X1FF9, 0XF78F, 0XE606, 0XD49D, 0XC514, 0XB1AB, 0XA022, 0X92B9, 0X8330, 0X7BC7, 0X6A4E, 0X58D5, 0X495C, 0X3DE3, 0X2C6A, 0X1EF1, 0X0F78  
};  /*** 采用查表法,根据数据生成CRC校验码* * @param message  校验值,为需要校验的字节* @return */public static String CRC_16_X25(byte[] message) {int crc_reg = 0xffff;//CRC校验时初值for (int i = 0; i < message.length; i++) {crc_reg = (crc_reg >> 8) ^ crc16_ccitt_table[(crc_reg ^ message[i]) & 0xff];}return Integer.toHexString(~crc_reg & 0xffff).toUpperCase();}public static String 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();return strCrc;}public static String CRC_16_XMODEM(byte[] bytes, int length) {int crc = 0x0000; // 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();return strCrc;}public static void main(String[] arg) {byte[] data2 = new byte[] { (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//使用CRC-16/CCITT-FALSE计算得到F2E3//使用CRC-16/XMODEM计算得到98E9//使用CRC-16/X25计算得到A27A//验证结果如下String result1 = CRC_16_CCITT_FALSE(data2, data2.length); //F2E3String result2 = CRC_16_XMODEM(data2, data2.length); //98E9String result3 = CRC_16_X25(data2); //A27ASystem.out.println(result1);System.out.println(result2);System.out.println(result3);System.out.println(HexStringBytesUtil.bytes2HexString(data2));}}

辅助类:

package com.huan.utils;public class HexStringBytesUtil {//十六进制的字节数组转十六进制形式的字符串public static String bytes2HexString(byte[] b) {String ret = "";for (int i = 0; i < b.length; i++) {String hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}ret += hex.toUpperCase();}return ret;}//十六进制形式的字符串转十六进制的字节数据public static byte[] hexStr2BinArr(String hexString){  //hexString的长度对2取整,作为bytes的长度  int len = hexString.length()/2;  byte[] bytes = new byte[len];  byte high = 0;//字节高四位  byte low = 0;//字节低四位  for(int i=0;i<len;i++){  //右移四位得到高位  high = (byte)((hexStr.indexOf(hexString.charAt(2*i)))<<4);  low = (byte)hexStr.indexOf(hexString.charAt(2*i+1));  bytes[i] = (byte) (high|low);//高地位做或运算  }  return bytes;  }   }

验证程序结果,打开在线工具 http://www.ip33.com/crc.html:


http://chatgpt.dhexx.cn/article/oagcbusP.shtml

相关文章

CCAT介绍

全国信息化计算机应用技术资格认证CCAT介绍 CCAT是Certificate of Computer Application Techniques 的简称&#xff0c;中文全称是“全国信息化计算机应用技术资格认证”&#xff0c;是由国家人事部中国高级公务员培训中心和教育部全国高等学校计算机教育研究会共同推出的一种…

C#_CRC-16/CCITT-FALSE计算加判断

C#_CRC-16/CCITT-FALSE计算加判断 前言&#xff1a;浪费半天时间研究出来的&#xff0c;试了网上其他好几个版本都算了不对&#xff0c;讲述的也不明确&#xff0c;我是直接移植一个c语言的版本&#xff0c;直接看代码&#xff0c;一个函数包含计算和判断的工能 private bool …

CRC-CCITT CRC-16

CRC分为以下几种标准&#xff1a; CRC-12码CRC-16码CRC-CCITT码CRC-32码 在线CRC计算器 https://www.lammertbies.nl/comm/info/crc-calculation.html CRC计算器 http://www.pc6.com/softview/SoftView_100981.html CRC16 const uint16_t Table[256] {0x0000U, 0x1…

C语言CRC-16 CCITT格式校验函数

C语言CRC-16 CCITT格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同同应用规范通过…

LabVIEW做CRC校验CRC-16/CCITT-FALSE算法

一直以来用的CRC校验的地方就是Modbus通讯&#xff0c;这次做项目遇到一个自定义协议需要CRC校验的协议&#xff0c;直接连例程发现计算结果不对通讯不上。后来发现CRC有很多中算法&#xff0c;网上资料也不全面。以下是我收藏总结的&#xff0c;估计也不全仅供参考。 参数解释…

CRC16-ccitt-false 递归解析每一个号码段的值

CRC16-ccitt-false 解析每一个号码段的值 数据准备 加密前&#xff1a;6011qwertyuiopa62440007db2a65b0306qrcode043339912211117000000016304 CRC16-ccitt-false加密后&#xff1a;4023&#xff08;网上有加密工具类&#xff0c;也有线上计算工具&#xff0c;如下图&#xff…

文本图像(二值图像)(黑白图像)的压缩算法介绍 CCITT-4 JBIG2

CCITT group3 CCITT group4 JBIG JBIG2 参考&#xff1a; JBIG2标准在数字图书馆中的应用 https://www.docin.com/p-821587404.html

C语言CRC-16 CCITT-FALSE格式校验函数

C语言CRC-16 CCITT-FALSE格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同应用规范…

Eclipse与JDK、JRE的关系

1、首先说明的是&#xff0c;eclipse人家需要jre&#xff0c;而不需要jdk&#xff0c;人家内置的有。你只要在你的电脑上安装一个jre就行。至于jdk&#xff0c;它内置的有2、eclise也不要求你jdk或者jre配置环境变量&#xff0c;毕竟友不用notepad写代码&#xff0c;dos编译执行…

JDK、JRE、JVM三者关系

jdk、jre、jvm三者有什么关系&#xff1f; JDK ☁️ JDK&#xff1a;Java开发工具包&#xff1b; ☁️ JDK中包含了以下内容&#xff1a; ⚡️ Java虚拟机&#xff1a;用于运行Java程序&#xff1b; ⚡️ 核心类库&#xff1a;核心类库中是已经编写好的Java代码&#xff0…

JRE和JDK

JRE和JDK JRE(Java运行环境)Java Runtime Environment 包括Java虚拟机(JVM Java VirtualMachine)和Java程序所需的核心类库等&#xff0c;如果想要运行一个开发好的Java程序&#xff0c;计算机中只需要安装JRE即可。 JRE 核心类库 JVM JDK(Java开发工具包)Java Development…

JDK,JRE,JVM三者间的关系,以及JDK、JRE的主要结构

一、JDK&#xff0c;JRE是什么&#xff1f; 1.JDK 是提供给 Java 开发人员使用的&#xff0c;其中包含了 java 的开发工具&#xff0c;也包括了 JRE。所以安装了JDK&#xff0c;就不用在单独安装JRE了。 2.JRE是包括 Java 虚拟机 (JVM J ava V irtual M achine) 和 Java 程…

【jdk与jre 的关系】

**jdk与jre 的关系** jdk中包含jre和核心开发工具, jre中包含jvm和核心开发类库 jdk中包含jre和核心开发工具, jre中包含jvm和核心开发类库 注: JVM是指Java虚拟机。

JDK、JRE和JVM三者之间关系

JDK、JRE和JVM三者之间关系 很多程序员已经写了很长一段时间java了&#xff0c;依然不明白JDK,JRE,JVM的区别。今天个人总结一下它们三者的关系、区别。 JDK&#xff08;Java Development Kit&#xff09;是针对Java开发员的产品&#xff0c;是整个Java的核心&#xff0c;包括了…

JDK与JRE的安装与配置

这两天为了这个JAVA的编译环境JDK和JRE的配置可花了不少心思&#xff0c;曾还一度把电脑的注册表给误删了&#xff0c;导致电脑重装了系统&#xff0c;这是血的教训。我买了一本学习JAVA的书&#xff0c;看了里面的视频终于把编译环境给配置好了&#xff0c;其实非常简单。 开始…

jdk与jre

jdk与jre jdk1.8目录jdk1.8下的bin目录jdk1.8下的jre目录jdk1.8下的lib目录 jdk1.8目录 安装好的JDK路径下目录如下&#xff1a;有bin、db、include、jre、lib、COPYRIGHT、javafx-src.zip、LICENSE、README.html、release、src.zip、THIRDPARTYLICENSEREADME.txt、THIRDPARTY…

【jdk和jre】

JRE和JDK JRE (Java Runtime Environment)\n是Java程序的运行时环境&#xff0c;包含JVM和运行时所需要的核心类库。 我们想要运行一个已有的Java程序&#xff0c; 那么只需安装JRE即可。 JDK (Java Development Kit)\n是Java程序开发工具包&#xff0c;包含JRE和开发人员使用…

jdk没有jre的解决方法

jdk11以上没有jre的解决方法 小白篇 安装的jdk没有jre(JDK11以上版本)解决方法方法一&#xff1a;步骤1&#xff1a;步骤2&#xff1a; 注意:方法二&#xff1a;步骤1&#xff1a;步骤2&#xff1a; 值得注意的是&#xff1a;1.2. 安装的jdk没有jre(JDK11以上版本) 我猜你安装…

jdk、jre、jvm分别是什么?有什么联系?

目录 介绍 JDK和JRE JRE和JVM 介绍 JDK&#xff1a;是Java Development Kit的缩写&#xff0c;是Java的开发工具包&#xff0c;JDK是整个JAVA的核心。它提供了编译、运行Java程序所需的各种工具和资源。有了它&#xff0c;Java开发者就可以编译和运行自己的Java程序。它包含…

JDK、JRE、JVM 之间的关系

总结&#xff1a; 关系&#xff1a;JDK包含JRE JRE包含JVM JDK (Java Development Kit)----Java开发工具包&#xff0c;用于Java程序的开发。 JRE (Java Runtime Environment)----Java运行时环境&#xff0c;只能运行.class文件&#xff0c;不能编译。 JVM (Java Virtual M…