JAVA获取CRC(即循环冗余校验)

这篇具有很好参考价值的文章主要介绍了JAVA获取CRC(即循环冗余校验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言:网上查了很多,CRC计算时,除数长度太长无法计算,所以写此文章。希望大家喜欢!

1、了解什么是CRC

    CRC(Cyclic Redundancy Check),即循环冗余校核,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法。

(1)CRC算法原理

    CRC校验本质上是选取一个合适的除数,要进行校验的数据是被除数,然后做模2除法,得到的余数就是CRC校验值。具体原理参见高人CRC说明点击《跳转》。

(2)被除数(即我们要传输的数据)

    做为传输数据,在底层都是01传输。那么在CRC计算中,将数据转换成2进制串进行计算,还原数学计算过程。由于网上现成的文章及代码都不能满足数据太长的计算,所以整个代码还原做模运算的除式。

(3)除数(即标准多项式)

    多项式,应不同产商的标准不同而不同。产商一般给出如: x3+x2+x0 、x3+x1+x0、x7+x6 +x5 +x2 +1的形式。表示为二进制分别为1101 、1011、11100101。

    注意:在多项式参与计算时。最高位与最低位必为1。按上面得余后,接收数据方在计算时可能会出错,这时可以尝试在多项式最高位加1,来参与计算。(这个坑小编深受其害)文章来源地址https://www.toymoban.com/news/detail-460870.html

2、核心代码如下:点击查看完整代码

package com.cqait.open.crc;

import com.cqait.open.utils.DataConversionUtils;

/**
 * CRC(Cyclic Redundancy Check),即循环冗余校核,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。
 * CRC利用除法及余数的原理,实现错误侦测的功能,具有原理清晰、实现简单等优点。
 * CRC校验本质上是选取一个合适的除数,要进行校验的数据是被除数,然后做模2除法,得到的余数就是CRC校验值。
 *
 * @author cqait-open
 */
public class Crc {

    /**
     * 多项式:原多项式为:11100101  在使用时一般会在最高位添加1。所以是9位了
     * X7 +X 6 +X 5 +X 2 +1
     */
    public static final String BIN_DXS = "111100101";

    /**
     * 获取CRC(即循环冗余校验码)
     *
     * <p>帧校验位(CS)
     * CRC(循环冗余校验) 校验 多项式:X 7 +X 6 +X 5 +X 2 +1 (X边上的数据是N次方)
     * 多项式与二进制:二进制可表示成多项式的形式,比如二进制1101表示为: x3+x2+x0;1011表示为:x3+x1+x0。
     * 所以 11100101 为以上多项式的二进制表示值,即为CRC的除数,控制域+地址域+链路用户数据(应用层)是CRC运算中的被除数 多项式一般省略了最前面的1在计算时加1
     * 参照:https://blog.csdn.net/u013073067/article/details/86621770?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-86621770-blog-123482805.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-86621770-blog-123482805.pc_relevant_paycolumn_v3&utm_relevant_index=2
     * </p>
     *
     * @param data 二进制字符串(要进行校验的数据)
     * @param dxs  多项式二进制串
     * @return 返回16进制字典串
     */
    public static String getDataCRC(String data, String dxs) {
        int dxsInt = Integer.parseInt(dxs, 2);
        int dxsLen = dxs.length();
        // 对被除数补0
        for (int i = 0; i < dxsLen - 1; i++) {
            data += "0";
        }
        int dataLen = data.length();

        int startIndex = 0;
        int endIndex = dxsLen;
        //初始化被除数
        String chushu = "";//data.substring(startIndex, endIndex);
        // 初始化补尾被除数
        String validYuShu = "";
        // 是否继续循环
        boolean isTrue = true;
        // CS值
        String binCS = "";
        do {
            // 被除数 获取本次需要计算的被除数
            chushu = validYuShu + data.substring(startIndex, endIndex);
            // 转成整形计算
            int chushuInt = Integer.parseInt(chushu, 2);
            // 异或计算得到整型的余数
            int yushuTemp = chushuInt ^ dxsInt;
            // 得到2进制余数
            String binYushu = DataConversionUtils.toBinString(yushuTemp, false);
            // 去掉前面的0
            int fisrtIndex = binYushu.indexOf("1");
            // 异或后为0
            validYuShu = "";
            if (fisrtIndex != -1) {
                validYuShu = binYushu.substring(fisrtIndex);
            }
            // 获取余数的长度
            int validYuShuLen = validYuShu.length();
            // 拼接下次计算的被除数
            //  设置下标
            startIndex = endIndex;
            // 得到需要从被除数上截取的字符长度
            int addCount = dxsLen - validYuShuLen;
            // 判断被除数有是否有被截取的字符
            addCount = endIndex + addCount > dataLen ? dataLen - endIndex : addCount;
            endIndex = endIndex + addCount;

            String temYUShu = validYuShu + data.substring(startIndex, endIndex);
            // 若最后的被除数位数<除数的位数,即此被除数为CS值
            if (temYUShu.length() < dxsLen) {
                isTrue = false;
                binCS = validYuShu + data.substring(startIndex, endIndex);
            }
        } while (isTrue);
        int binCsLen = binCS.length();
        // cs补整齐长度为=多项式长度-1
        for (int i = 0; i < dxsLen - binCsLen - 1; i++) {
            binCS = "0" + binCS;
        }
        String resHex = DataConversionUtils.toHexString(Integer.parseInt(binCS, 2));
        resHex = resHex.length() < 2 ? "0" + resHex : resHex;
        //LogUtils.debug(Send427Utils.class, "生成CRC:{}|{}", resHex, binCS);
        return resHex;

    }
}

ps:小编第一次写文章,有不对的请指出,大家一起探讨。喜欢算法或需要求解代码实现算法的,可以评论区提出,一起解决!小编是一个喜欢算法实现的程序人。

到了这里,关于JAVA获取CRC(即循环冗余校验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【基础知识】CRC(循环冗余校验)直接计算和查表法

    校验是什么,个人理解就是经过一个算法,使用大量数据(几MB的数据)生成较小长度的一串信息(如16Bit),并切要做到 原数据不同时,生成的信息大概率不同(不是加密算法不考虑刻意造数据的情况) 原数据中任意一个或几个数据出现错误时,生成的信息不同(所有的原信

    2024年02月05日
    浏览(58)
  • CRC循环冗余校验 (Cyclic Redundancy Check) 原理/电路实现/Verilog实现

    目录 1 什么是CRC循环冗余校验? 2 CRC校验的原理 2.1 多项式表示 2.2 模二 多项式除法 2.3 传输端  2.4 接收端 3 CRC码的产生 3.1 产生CRC码步骤 3.2 Verilog实现 4 电路实现原理—线性反馈移位寄存器 4.1 循环移位寄存器结构 4.2 最大长度移位寄存器  4.3 多项式除法电路(线性反馈移位

    2024年02月04日
    浏览(37)
  • 计算机网络:数据链路层之差错控制、奇偶校验码、CRC循环冗余码、海明码

    带你度过期末难关 文章目录 一、差错控制 1、冗余编码 2、编码VS编码 二、检错编码 1、奇偶校验码 2、CRC循环冗余码 三、纠错编码————海明码 海明距离 1、确定校验码位数r 2、确定校验码和数据的位置 3、求出校验码的值 4、检错并纠错 纠错的方法一: 纠错方法二: 总

    2024年02月04日
    浏览(52)
  • CRC冗余校验的原理和FPGA实现思路

    CRC校验码,顾名思义是用于 校验 的。它可以用于检测数据传输过程中是否出现错误(某些位,或某几位,或者某块区域位错误),反正 可以知道数据出错了,但是不能纠错 。 CRC校验,本质上是模2除法求余。将发送信息 M 当做被除数,发送方和接收方共同约定一个除数 G

    2024年02月08日
    浏览(62)
  • 题解校验码—CRC循环校验码与海明校验码

    一个编码系统的码距是 任意两个码字 的最小距离。 例如个编码系统采用三位长度的二进制编码,若该系统有四种编码分别为:000,011,100,111,此编码系统中000与111的码距为3;011与000的码距为2;011与111的码距为1,则该编码系统的码距为1。 码距计算方法:两个编码按位异

    2024年02月04日
    浏览(42)
  • 解决灵科路由循环冗余校验错误排除操作指南

    本文为大家介绍的是由于路由器循环冗余校验错误,所造成POS故障的解决办法,循环冗余校验,其特点是:检错能力极强,开销小,易于用编码器及检测电路实现,从其检错能力来看,它所不能发现的错误的几率非常低。 一、组网环境 在灵科路由器的组网环境中,在个点使用

    2024年02月05日
    浏览(43)
  • android用java生成crc校验位

    在串口通信中,经常会用到后两位生成crc校验位的情况。 下面是校验位生成方法: 调用: 打印日志:  

    2024年02月11日
    浏览(38)
  • 计算机网络----CRC冗余码的运算

    冗余码是用于在数据链路层的通信链路和传输数据过程中可能会出错的一种检错编码方法(检错码)。 原理:发送发把数据划分为组,设每组 K 个比特,在其后添加供差错检验用的 n 位冗余码,( K+n )比特一起发送。 过程: 注意: 模二除法运算的过程相当于 异或 。 因为

    2024年02月12日
    浏览(51)
  • C#: CRC8,CRC16,CRC32 校验代码

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

    2024年01月18日
    浏览(39)
  • (python)数据校验-CRC32校验

    目录 前言 数据校验概念 CRC校验算法 CRC计算原理 算法逻辑 流程图 CRC算法种类 代码实现CRC算法 python实现算法① python实现算法② 总结         在二次开发eCan上位机应用时,遇到了采用CRC(全称是循环冗余校验)32算法 校验文件传输完整性 的场景,浅浅地记录一下使用心得.  

    2023年04月16日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包