CRC 校验

匠心零度 转载请注明原创出处,谢谢!

说明

上篇RocketMQ(二):RPC通讯介绍了rocketmq的一些rpc细节,其实这些内容不仅仅是rocketmq内容,任何通信模块基本都是类似的,这块内容是高度公用的,今天我们来看看 CRC 校验,也是通信模块里面常常使用到的技术。

CRC简介

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

CRC32检错能力极强,开销小,易于用编码器及检测电路实现。从其检错能力来看,它所不能发现的错误的几率仅为0.0047%以下。从性能上和开销上考虑,均远远优于奇偶校验及算术和校验等方式。因而,在数据存储和数据通讯领域,CRC无处不在:著名的通讯协议X.25的FCS(帧检错序列)采用的是CRC-CCITT,ARJ、LHA等压缩工具软件采用的是CRC32,磁盘驱动器的读写采用了CRC16,通用的图像存储格式GIF、TIFF等也都用CRC作为检错手段。

CRC使用

public static void main(String[] args) {
        int crc = crc32("欢迎关注:匠心零度".getBytes());
        int crc1 = crc32("欢迎关注:匠心零度".getBytes());
        int crc2 = crc32("欢迎关注:匠心零度!".getBytes());

        System.out.println(crc==crc1);
        System.out.println(crc== crc2);
    }


    public static int crc32(byte[] array) {
        if (array != null) {
            return crc32(array, 0, array.length);
        }
        return 0;
    }

    public static int crc32(byte[] array, int offset, int length) {
        CRC32 crc32 = new CRC32();
        crc32.update(array, offset, length);
        return (int) (crc32.getValue() & 0x7FFFFFFF);
    }

输出结果:

true
false

rocketmq部分使用

162a345463c5b74a?w=391&h=48&f=jpeg&s=17775

162a3455d673b521?w=689&h=161&f=jpeg&s=53269

crc32 JDK内部实现

162a3457135d7f53?w=1148&h=897&f=jpeg&s=338583

162a345879ebbb8e?w=749&h=992&f=jpeg&s=273935

通过反复的移位和进行CRC的除法,最终该寄存器中的值就是我们所要求的余数。

备注: 具体实现细节没有去细细了解,需要了解的请自行深入学习。


如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!

加入知识星球,一起探讨!

1629066bef3a4359?w=640&h=290&f=jpeg&s=15090

转载于:https://www.cnblogs.com/jiangxinlingdu/p/8759027.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值