Android开发中使用CRC校验

2024-09-04 18:08
文章标签 android 使用 校验 开发 crc

本文主要是介绍Android开发中使用CRC校验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近手头的一个项目,客户端和服务端之间进行通讯时,由于受到当地网络等问题的限制,使用Json传输,数据内容过于庞大,需要对该信息进行压缩,以便实现快速传输。这里使用Byte数组进行传输,前后台对协议进行商定,而后编码、传输、解码实现通信,传输过程中,为保证传输内容的完整性,需要使用CRC进行校验。

CRC概念——百度百科

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

CRC编码

编码:根据传输内容逐位计算,得到CRC编码,附加在该Byte数组后边。

/**

 * 为Byte数组添加两位CRC校验

 *

 * @param buf

 * @return

 */

public static byte[]setParamCRC(byte[] buf)

{

    int MASK = 0x0001, CRCSEED = 0x0810;

    int remain = 0;

 

    byte val;

    for (int i = 0; i < buf.length; i++)

    {

        val = buf[i];

        for (int j = 0; j < 8; j++)

        {

            if (((val ^ remain) & MASK) !=0)

            {

                remain ^= CRCSEED;

                remain >>= 1;

                remain |= 0x8000;

            }

            else

            {

                remain >>= 1;

            }

            val >>= 1;

        }

    }

 

    byte[] crcByte = new byte[2];

    crcByte[0] = (byte) ((remain >> 8)& 0xff);

    crcByte[1] = (byte) (remain & 0xff);

 

    // 将新生成的byte数组添加到原数据结尾并返回

    return concatAll(buf, crcByte);

}

CRC解码

在服务端接受到客户端传输过来的byte数组,然后先进行CRC校验,通过后,才能确定数据在传输过程中未发生改变,才能进行下一步业务操作。

/***

 * CRC校验是否通过

 *

 * @param srcByte

 * @param length

 * @return

 */

public static booleanisPassCRC(byte[] srcByte, int length)

{

    // 取出除crc校验位的其他数组,进行计算,得到CRC校验结果

    int calcCRC = calcCRC(srcByte, 0,srcByte.length - length);

 

    // 取出CRC校验位,进行计算

    int receive =toInt(getBytesByindex(srcByte, srcByte.length - length, srcByte.length - 1));

 

    // 比较

    return calcCRC == receive;

}

在这中间 计算CRC的方法和之前的基本是一致的。只是第二步中,取到两位CRC校验值以后,将其转为int,然后进行比较

Demo

这里有一个我写的CRC校验的Demo,没有使用jar包,可以进行修改。

CRC校验Demo

 


这篇关于Android开发中使用CRC校验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1136645

相关文章

Python FastAPI实现JWT校验的完整指南

《PythonFastAPI实现JWT校验的完整指南》在现代Web开发中,构建安全的API接口是开发者必须面对的核心挑战之一,本文将深入探讨如何基于FastAPI实现JWT(JSONWebToken... 目录一、JWT认证的核心原理二、项目初始化与环境配置三、安全密码处理机制四、JWT令牌的生成与验证五、

go rate 原生标准限速库的使用

《gorate原生标准限速库的使用》本文主要介绍了Go标准库golang.org/x/time/rate实现限流,采用令牌桶算法控制请求速率,提供Allow/Reserve/Wait方法,具有一定... 目录介绍安装API介绍rate.NewLimiter:创建限流器limiter.Allow():请求是否

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Python使用Turtle实现精确计时工具

《Python使用Turtle实现精确计时工具》这篇文章主要为大家详细介绍了Python如何使用Turtle实现精确计时工具,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录功能特点使用方法程序架构设计代码详解窗口和画笔创建时间和状态显示更新计时器控制逻辑计时器重置功能事件

Swagger2与Springdoc集成与使用详解

《Swagger2与Springdoc集成与使用详解》:本文主要介绍Swagger2与Springdoc集成与使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录1. 依赖配置2. 基础配置2.1 启用 Springdoc2.2 自定义 OpenAPI 信息3.

Golang interface{}的具体使用

《Golanginterface{}的具体使用》interface{}是Go中可以表示任意类型的空接口,本文主要介绍了Golanginterface{}的具体使用,具有一定的参考价值,感兴趣的可以了... 目录一、什么是 interface{}?定义形China编程式:二、interface{} 有什么特别的?✅

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

windows和Linux安装Jmeter与简单使用方式

《windows和Linux安装Jmeter与简单使用方式》:本文主要介绍windows和Linux安装Jmeter与简单使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows和linux安装Jmeter与简单使用一、下载安装包二、JDK安装1.windows设

Spring 缓存在项目中的使用详解

《Spring缓存在项目中的使用详解》Spring缓存机制,Cache接口为缓存的组件规范定义,包扩缓存的各种操作(添加缓存、删除缓存、修改缓存等),本文给大家介绍Spring缓存在项目中的使用... 目录1.Spring 缓存机制介绍2.Spring 缓存用到的概念Ⅰ.两个接口Ⅱ.三个注解(方法层次)Ⅲ.

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不