首页 > 编程语言 >Java计算CRC16校验码

Java计算CRC16校验码

时间:2023-08-03 17:38:03浏览次数:34  
标签:Java 字节 CRC16 int bytes 校验码 CRC 寄存器 byte

废话不多说,直接上代码

/**
     * 计算CRC16校验码
     *
     * @param bytes 需要计算的字节数组
     */
    public static byte[] getCRCByteArray(byte[] bytes) {
        //        ModBus 通信协议的 CRC ( 冗余循环校验码含2个字节, 即 16 位二进制数。
        //        CRC 码由发送设备计算, 放置于所发送信息帧的尾部。
        //        接收信息设备再重新计算所接收信息 (除 CRC 之外的部分)的 CRC,
        //        比较计算得到的 CRC 是否与接收到CRC相符, 如果两者不相符, 则认为数据出错。
        //
        //        1) 预置 1 个 16 位的寄存器为十六进制FFFF(即全为 1) , 称此寄存器为 CRC寄存器。
        //        2) 把第一个 8 位二进制数据 (通信信息帧的第一个字节) 与 16 位的 CRC寄存器的低 8 位相异或, 把结果放于 CRC寄存器。
        //        3) 把 CRC 寄存器的内容右移一位( 朝低位)用 0 填补最高位, 并检查右移后的移出位。
        //        4) 如果移出位为 0, 重复第 3 步 ( 再次右移一位); 如果移出位为 1, CRC 寄存器与多项式A001 ( 1010 0000 0000 0001) 进行异或。
        //        5) 重复步骤 3 和步骤 4, 直到右移 8 次,这样整个8位数据全部进行了处理。
        //        6) 重复步骤 2 到步骤 5, 进行通信信息帧下一个字节的处理。
        //        7) 将该通信信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换。
        //        8) 最后得到的 CRC寄存器内容即为 CRC码。
        int CRC = 0x0000ffff;
        int POLYNOMIAL = 0x0000a001;

        int i, j;
        for (i = 0; i < bytes.length; i++) {
            CRC ^= ((int) bytes[i] & 0x000000ff);
            for (j = 0; j < 8; j++) {
                if ((CRC & 0x00000001) != 0) {
                    CRC >>= 1;
                    CRC ^= POLYNOMIAL;
                } else {
                    CRC >>= 1;
                }
            }
        }
        //高低位转换
        CRC = ((CRC & 0xFF00) >> 8) | ((CRC & 0x00FF) << 8);
        //返回CRC16校验码字节数组
        return getByteArrayInt2(CRC);
    }
// int转换为byte[2]数组
    public static byte[] getByteArrayInt2(int s) {
        byte[] b = new byte[2];
        b[0] = (byte) ((s & 0xff00) >> 8);
        b[1] = (byte) (s & 0x00ff);
        return b;
    }

标签:Java,字节,CRC16,int,bytes,校验码,CRC,寄存器,byte
From: https://blog.51cto.com/u_16207345/6951104

相关文章

  • Java入门题-百钱买百鸡
    题:100钱买100只鸡,必须满足,钱花完,鸡百只 重点:循环语句来枚举所有可能性 代码:byteplan=1;for(inti=0;i<20;i++){for(inti1=0;i1<34;i1++){for(inti2=0;i2<101;i2++){if(((i*5+i1*3+i2)==100)&&((i+i1......
  • 基于JAVA的博客平台设计与实现
    随着互联网技术的快速发展,利用博客平台实现用户资讯的发布管理成为很多互联网公司研究的热门话题。通过对博客平台系统的网站功能需要进行讨论研究,这种资讯发布非常符合资讯发展的潮流,博客平台的实现将会对当前网站的信息推广产生不可估量的巨大浏览提升。正是鉴于此种对潜在用户主......
  • java mybatis一级缓存二级缓存三级缓存详解
    在MyBatis中,存在一级缓存、二级缓存和三级缓存的概念。下面我将为你详细解释这些缓存的含义和作用:一级缓存:一级缓存是MyBatis默认开启的缓存机制,它是指在同一个SqlSession对象中,执行相同的SQL语句时,会将查询结果缓存到内存中。一级缓存的作用范围仅限于当前的SqlSession,当......
  • Java(从零到企业级电商项目实战)学习笔记
    资料网站:http://learning.happymmall.com/env.html一、mybatis三剑客:generator,plugin,pagehelperpagehelper->https://github.com/pagehelper/Mybatis-PageHelper二、spring例子:https://github.com/spring-projects/spring-mvc-showcasehttps://github.com/spring-proj......
  • 前端性能优化的利器 ——— 浅谈JavaScript中的防抖和节流
    防抖和节流函数是工作中两种常用的前端性能优化函数,今天我就来总结一下什么是防抖和节流,并详细说明一下如何在工作中应用防抖和节流函数什么是防抖和节流?在JavaScript中,防抖(debounce)和节流(throttle)是用来限制函数执行频率的两种常见技术。防抖(debounce)是指在某个时间段内......
  • Java后端02(jsp)
    jsp​ servlet是无法将后端获取的数据传递给html页面的,无法再servlet中通过转发或者是重定向的方式,给html页面传递响应的后端数据,servlet中由于拼接过于繁琐,是不适合写html的因此引入了jsp,既可以编写html标签,也可以写Java代码,<dependency><groupId>javax.serv......
  • Java后端03(浅谈注解)
    注解功能一:提示信息功能二:存储信息​ 注解需要定义注解类,类对象需要有落实的实体,注解可以出现在类Class上,方法Method上,成员变量Field上以及构造方法Constructor上,注解对象需要被添加注解的实体所对应的反射对象进行获取,人话:要获得注解信息,首先要获得修饰的东西的反射......
  • Java后端04(Ajax异步加载)
    Ajax异步加载jsp涉及到的问题每次哪怕是页面的局部修改,都会导致服务器重新获取,页面的所有信息,导致jsp页面的效率非常低下前端jsp页面无法脱离服务器运行前端和后端无法分离开发,开发效率低下Ajax介绍​ Ajax是由谷歌开发,底层是通过js开发的技术,如果页面内容只是局部......
  • Javascript 方法有多个参数有默认值,但是只想为其中某个参数赋值
    例子:functionlog(a,b=2,c=3,d=4){console.log(a,b,c,d)}log(1);//output:1234log(1,3,6,9);//1369log(1,undefined,9,12);//12912log(1,undefined,0);//1204log(1,undefined,undefined,16);//12316就是在你想......
  • Java入门题-输入一个字母,判断是不是大写,是直接输出,不是转换成大写输出
    重要:利用ASCII码判断字母是否是大小写需要引用Scanner方法 代码:importjava.util.Scanner;1、利用char数组转化的优点在于面对字符串,也可以批量对单个字符操作Scannerget_letter=newScanner(System.in);StringgetLetter=get_letter.next();charss[]=getLetter.to......