CRC16校验算法的Java实现 您所在的位置:网站首页 十六进制字符密码怎么设置 CRC16校验算法的Java实现

CRC16校验算法的Java实现

2023-11-14 04:00| 来源: 网络整理| 查看: 265

CRC16校验算法简介

CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

Crc16Util说明

CRC16有多种实现算法,这里是基于Modbus CRC16的校验算法的java实现。如果是基于其他的协议的算法,只需更改getCrc16()中的实现。 getCrc16();是核心算法,获取校验码byte数组。 intToBytes();将算出的int类型转成byte数组,低位在前,高位在后。改变高地位顺序,只需改变方法中数组的顺序。 getData();获取源数据和验证码的组合byte数组,可以传入byte数组,也可以传入十六进制字符数组。 byteTo16String();将byte或byte数组转换成十六进制字符,这里主要用于测试观察校验算法的结果。

工具类源码 /** * 基于Modbus CRC16的校验算法工具类 */ public class Crc16Util { /** * 获取源数据和验证码的组合byte数组 * @param strings 可变长度的十六进制字符串 * @return */ public static byte[] getData(String...strings) { byte[] data = new byte[]{}; for (int i = 0; i 0) { // 如果移出位为 1, CRC寄存器与多项式A001进行异或 crc = crc >> 1; crc = crc ^ 0xA001; } else // 如果移出位为 0,再次右移一位 crc = crc >> 1; } } return intToBytes(crc); } /** * 将int转换成byte数组,低位在前,高位在后 * 改变高低位顺序只需调换数组序号 */ private static byte[] intToBytes(int value) { byte[] src = new byte[2]; src[1] = (byte) ((value>>8) & 0xFF); src[0] = (byte) (value & 0xFF); return src; } /** * 将字节数组转换成十六进制字符串 */ public static String byteTo16String(byte[] data) { StringBuffer buffer = new StringBuffer(); for (byte b : data) { buffer.append(byteTo16String(b)); } return buffer.toString(); } /** * 将字节转换成十六进制字符串 * int转byte对照表 * [128,255],0,[1,128) * [-128,-1],0,[1,128) */ public static String byteTo16String(byte b) { StringBuffer buffer = new StringBuffer(); int aa = (int)b; if (aa0 && aa15) { buffer.append(Integer.toString(aa, 16)+" "); } return buffer.toString(); } } 测试代码 public static void main(String[] args) { byte[] dd = Crc16Util.getData("FE", "05","66"); String str = Crc16Util.byteTo16String(dd).toUpperCase(); System.out.println(str); }

打印结果:FE 05 66 93 4A



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有