Java Modbus CRC16校验

最近在做一个跟前端硬件通信的中间件,其中数据校验采用CRC16,网上查了很多资料,但发现最终的计算结果都不同……耗时两天终于解决了,做个记录。

 1  /**
 2      * 计算CRC16校验码
 3      *
 4      * @param bytes 字节数组
 5      * @return {@link String} 校验码
 6      * @since 1.0
 7      */
 8     public static String getCRC(byte[] bytes) {
 9         int CRC = 0x0000ffff;
10         int POLYNOMIAL = 0x0000a001;
11         int i, j;
12         for (i = 0; i < bytes.length; i++) {
13             CRC ^= ((int) bytes[i] & 0x000000ff);
14             for (j = 0; j < 8; j++) {
15                 if ((CRC & 0x00000001) != 0) {
16                     CRC >>= 1;
17                     CRC ^= POLYNOMIAL;
18                 } else {
19                     CRC >>= 1;
20                 }
21             }
22         }
23         return Integer.toHexString(CRC);
24     }
25
26     /**
27      * 将16进制单精度浮点型转换为10进制浮点型
28      *
29      * @return float
30      * @since 1.0
31      */
32     private float parseHex2Float(String hexStr) {
33         BigInteger bigInteger = new BigInteger(hexStr, 16);
34         return Float.intBitsToFloat(bigInteger.intValue());
35     }
36
37     /**
38      * 将十进制浮点型转换为十六进制浮点型
39      *
40      * @return String
41      * @since 1.0
42      */
43     private String parseFloat2Hex(float data) {
44         return Integer.toHexString(Float.floatToIntBits(data));
45     }
时间: 2024-10-16 13:51:08

Java Modbus CRC16校验的相关文章

Modbus CRC16 校验计算函数

// CRC 高位字节值表 static const uint8_t auchCRCHi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0

// 生成modbus CRC16数据

CRC-16 / MODBUS : 1)CRC寄存器初始值为 FFFF:即16个字节全为1: 2)CRC-16 / MODBUS的多项式A001H (1010 0000 0000 0001B) ‘H’表示16进制数,‘B’表示二进制数 计算步骤为:  (1).预置 16 位寄存器为十六进制 FFFF(即全为 1) ,称此寄存器为 CRC  寄存器:   (2).把第一个 8  位数据与 16  位 CRC  寄存器的低位相异或,把结果放于 CRC  寄 存器:  (3).检测相异或后的CRC寄存

java实现身份证校验

原文来自:java教程网 题目:身份证校验 身份证校验 如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以! 因为有人的身份证最后一位是"X" 实际上,除了最后一位的X,不会出现其它字母! 身份证号码18位 = 17位 + 校验码 校验码的计算过程: 例如:身份证前17位 = ABCDEFGHIJKLMNOPQ A~Q 每位数字乘以权值求和(每位数字和它对应的“权”相乘后累加) 17位对应的权值分别是: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8

C# CRC16校验码 1.0

  /// <summary> /// 计算CRC16校验码 1.0 /// </summary> /// <param name="bytes">字节数组</param> /// <param name="len">校验的长度</param> /// <returns>校验码</returns> public static int GetCRC(byte[] bytes

java身份证号校验

package com.pt.modules.contract.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.regex.Pattern; public class IdcardValida

java身份证合法性校验并获取并根据身份证号提取身份证相关信息

/** * 身份证前6位[ABCDEF]为行政区划数字代码(简称数字码)说明(参考<GB/T 2260-2007 中华人民共和国行政区划代码>): * 该数字码的编制原则和结构分析,它采用三层六位层次码结构,按层次分别表示我国各省(自治区,直辖市,特别行政区). * 市(地区,自治州,盟).县(自治县.县级市.旗.自治旗.市辖区.林区.特区). 数字码码位结构从左至右的含义是: 第一层为AB两位代码表示省.自治区.直辖市.特别行政区: 第二层为CD两位代码表示市.地区.自治州.盟.直辖市所辖市

java生成MD5校验码

在Java中,java.security.MessageDigest (rt.jar中)已经定义了 MD5 的计算,所以我们只需要简单地调用即可得到 MD5 的128 位整数.然后将此 128 位计 16 个字节转换成 16 进制表示即可. 下面是一个可生成字符串或文件MD5校验码的例子,测试过,可当做工具类直接使用,其中最主要的是getMD5String(String s)和getFileMD5String(File file)两个方法,分别用于生成字符串的md5校验值和生成文件的md5校验值

Delphi CRC16校验算法实现(转)

循环冗余码校验英文名称为Cyclical Redundancy Check,简称CRC.它是利用除法及余数的原理来作错误侦测(Error Detecting)的.实际应用时,发送装置计算出CRC值并随数据一同发送给接收装置,接收装置对收到的数据重新计算CRC并与收到的CRC相比较,若两个CRC值不同,则说明数据通讯出现错误. 根据应用环境与习惯的不同,CRC又可分为以下几种标准: ①CRC-12码: ②CRC-16码: ③CRC-CCITT码: ④CRC-32码. CRC-12码通常用来传送6-

java身份证号码校验、邮箱校验、手机号码/电话号码校验

import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.Hashtable; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ValidateUtils