C语言实现CRC校验

C语言实现CRC校验

要实现C语言中的CRC校验,你可以按照以下步骤进行操作:

  1. 首先,确定所使用的CRC算法和参数(比如CRC-16、CRC-32等)以及多项式(生成多项式)的值。

  2. 创建一个CRC查找表(Table),用于存储预先计算好的CRC值。根据所选择的CRC算法和参数,表格的大小会有所不同。

  3. 给定待校验的数据(比如一个字节数组),初始化一个CRC寄存器为初始值(通常为全1或全0)。

  4. 对每个字节进行以下操作:
    a) 将当前字节与CRC寄存器的最高位对齐。
    b) 通过查找表,将CRC寄存器的值与当前字节进行XOR运算。
    c) 将CRC寄存器向左移动一个字节,并将结果与查找表中的值进行XOR运算。

  5. 处理完所有字节后,CRC寄存器中的值即为校验结果。

下面是一个简单的示例代码,演示了如何实现CRC-16校验:

#include <stdio.h>unsigned short crc16_ccitt(unsigned char *data, int len) {unsigned short crc = 0xFFFF;unsigned short lookup_table[256] = {// CRC-16/CCITT lookup table// ...};for (int i = 0; i < len; i++) {crc = (crc << 8) ^ lookup_table[(crc >> 8) ^ data[i]];}return crc;
}int main() {unsigned char data[] = {0x12, 0x34, 0x56, 0x78};int data_len = sizeof(data) / sizeof(data[0]);unsigned short crc = crc16_ccitt(data, data_len);printf("CRC-16 result: %04X\n", crc);return 0;
}

对于16位循环冗余效验(CRC-16),CRC结果为单字,其低字节在前,高字节在后。其生成步骤大致如下:

  1. 设置一个16位的CRC寄存器,并赋以初值0xFFFF

  2. 将数据帧中的第一个字节,与CRC寄存器的低8位按位异或,并保存在CRC寄存器中

  3. 将CRC寄存器右移1位,并检测移出的最低位是否为1,如果最低位为1,则将CRC寄存器与固定数0xA001异或

  4. 重复步骤3共8次

  5. 对数据帧的下一个字节重复步骤2,3,4,直到数据域的最后一个数据

  6. 最后的CRC寄存器中的内容,就是最后的效验值,将其附加在数据帧的最后一个数据之后,并保持低8位在前,高8位在后的放置。

#include <stdio.h>
typedef unsigned short Uint16;
int main()
{   Uint16 crc;crc=0xffff;char a[6]={0x01,0x03,0x00,0x00,0x00,0x0a};char *buf;buf=&a[0];unsigned char i,j,check;for( i=0; i<6; i++){crc =crc^*buf;for(j=0; j<8; j++){check = crc&1;crc = crc>>1;crc = crc&0x7fff;if(check) crc =crc^0xa001;}buf++; }printf("%x",crc);return 0; 
}

要实现C语言中的CRC-32校验,你可以按照以下步骤进行操作:

  1. 首先,确定使用的CRC算法和参数,这里是CRC-32。

  2. 创建一个CRC查找表(Table),用于存储预先计算好的CRC值。根据所选择的CRC算法和参数,表格的大小会有所不同。

  3. 给定待校验的数据(比如一个字节数组),初始化一个CRC寄存器为初始值(通常为全1或全0)。

  4. 对每个字节进行以下操作:
    a) 将当前字节与CRC寄存器的最高位对齐。
    b) 通过查找表,将CRC寄存器的值与当前字节进行XOR运算。
    c) 将CRC寄存器向左移动一个字节,并将结果与查找表中的值进行XOR运算。

  5. 处理完所有字节后,CRC寄存器中的值即为校验结果。

下面是一个简单的示例代码,演示了如何实现CRC-32校验:

#include <stdio.h>unsigned int crc32(unsigned char *data, int len) {unsigned int crc = 0xFFFFFFFF;unsigned int lookup_table[256] = {// CRC-32 lookup table// ...};for (int i = 0; i < len; i++) {crc = (crc >> 8) ^ lookup_table[(crc ^ data[i]) & 0xFF];}return ~crc;
}int main() {unsigned char data[] = {0x12, 0x34, 0x56, 0x78};int data_len = sizeof(data) / sizeof(data[0]);unsigned int crc = crc32(data, data_len);printf("CRC-32 result: %08X\n", crc);return 0;
}

CRC-32常用(事实标准)检验函数针对能够从硬件上进行比特流实时计算而设计,即每个数据的一位进来后马上就能进行CRC-32,而不必收全数据再计算。因此对应的软件CRC-32存在一些特点:

初始值预设为0xFFFFFFFF
针对数据字节的低位先传输场景,因此数据字节的低位是高优先处理的
按照字节分段进行CRC-32计算,字节放在寄存器的低字节,因此字节最低位在左高由低的最右边一位,在进行CRC计算过程时,要从最低位/最右侧位置开始判断,移位时向右移出。因为校验码高冥端也要相应对齐,所以检验码也就要做倒位序,如0x04C11DB7(0000 0100 1100 0001 0001 1101 1011 0111)倒序为了0xEDB88320(1110 1101 1011 1000 1000 0011 0010 0000)
输出异或0xFFFFFFFF
CRC-32常用(事实标准)校验函数为反向算法(反向算法是从由右向左计算,也即计算过程中移位时,向右移出。)

uint32_t PY_CRC_32_M(uint8_t *di, uint32_t len)
{uint32_t crc_poly = 0xEDB88320;  //Inversion bit sequence of 0x04C11DB7uint32_t data_t = 0xFFFFFFFF; //initial valuefor(uint32_t i=0; i<len; i++){data_t ^=  di[i];for (int8_t j = 8; j > 0; --j){data_t = (data_t >> 1) ^ ((data_t & 1)? crc_poly: 0);}}return data_t ^ 0xFFFFFFFF;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

pg数据表同步到hive表数据压缩总结

1、背景 pg库存放了大量的历史数据&#xff0c;pg的存储方式比较耗磁盘空间&#xff0c;pg的备份方式&#xff0c;通过pgdump导出后&#xff0c;进行gzip压缩&#xff0c;压缩比大概1/10&#xff0c;随着数据的积累磁盘空间告警。为了解决pg的压力&#xff0c;尝试采用hive数据…

树与二叉树的概念 性质及其存储结构

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 树与二叉树 树的概念与结构&#xff1a;树的概…

并查集专题

一、并查集的定义 二、基本操作 1、初始化 一开始,每个元素都是独立的集合 #include<iostream>using namespace std;const int maxN=1000; int father[maxN];int</

奶茶果饮外卖配送小程序商城的作用是什么

奶茶果饮商家众多&#xff0c;有加盟品牌也有独立自创品牌或小店等&#xff0c;奶茶果饮已经成为众多年轻人群体喜爱的饮品&#xff0c;在实际消费方面&#xff0c;普遍以到店外卖为主&#xff0c;市场需求较高&#xff0c;但同样的竞争压力也不小。 同行竞争激烈&#xff0c;…

电脑技巧:笔记本电脑升级固态硬盘的注意事项,看完你就懂了

目录 1、接口类型 2、接口速率 3、固态硬盘的尺寸 4、发热情况 5、总结 如今的固态硬盘价格越来越便宜了&#xff0c;甚至某品牌4TB的PCIe4.0 M.2还爆出过不到900元的“报恩价”&#xff0c;让不少小伙伴都动了扩容甚至囤货的心思。但对于笔记本电脑用户来说&#xff0c;升…

【MATLAB-基于直方图优化的图像去雾技术】

【MATLAB-基于直方图优化的图像去雾技术】 1 直方图均衡2 程序实现3 局部直方图处理 1 直方图均衡 直方图是图像的一种统计表达形式。对于一幅灰度图像来说&#xff0c;其灰度统计直方图可以反映该图像中不同灰度级出现的统计情况。一般而言&#xff0c;图像的视觉效果和其直方…

自学网络安全———(黑客技术)

如果你想自学网络安全&#xff0c;首先你必须了解什么是网络安全&#xff01;&#xff0c;什么是黑客&#xff01;&#xff01; 1.无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面性&#xff0c;例如 Web 安全技术&#xff0c;既有 Web 渗透2.也有 Web 防…

借助 ControlNet 生成艺术二维码 – 基于 Stable Diffusion 的 AI 绘画方案

背景介绍 在过去的数月中&#xff0c;亚马逊云科技已经推出了多篇博文&#xff0c;来介绍如何在亚马逊云科技上部署 Stable Diffusion&#xff0c;或是如何结合 Amazon SageMaker 与 Stable Diffusion 进行模型训练和推理任务。 为了帮助客户快速、安全地在亚马逊云科技上构建、…

用AVR128单片机的音乐门铃

一、系统方案 1、使用按键控制蜂鸣器模拟发出“叮咚”的门铃声。 2、“叮”声对应声音频率714Hz&#xff0c;“咚”对应声音频率500Hz,这两种频率由ATmega128的定时器生成&#xff0c;定时器使用的工作模式自定&#xff0c;处理器使用内部4M时钟。“叮”声持续时间300ms&#x…

No150.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【5G PHY】物理层逻辑和物理天线的映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

【AI视野·今日NLP 自然语言处理论文速览 第四十四期】Fri, 29 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 29 Sep 2023 Totally 45 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers MindShift: Leveraging Large Language Models for Mental-States-Based Problematic Smartphone Use Interve…

第五章——文件内容显示

5.1 浏览普通文件内容 注意 以上命令的语法&#xff1a;命令 【option】所查文件名 set命令 显示5到10行的信息 [rootcomeon ~]#sed -n 5,10p /etc/passwd 5.2 过滤文件内容显示--grep 语法 grep 【option】... 关键字符串 所查文件名... 使用特殊符号进行字符串的匹配 5…

论文笔记:ViTGAN: Training GANs with Vision Transformers

2021 1 intro 论文研究的问题是&#xff1a;ViT是否可以在不使用卷积或池化的情况下完成图像生成任务 即不用CNN&#xff0c;而使用ViT来完成图像生成任务将ViT架构集成到GAN中&#xff0c;发现现有的GAN正则化方法与self-attention机制的交互很差&#xff0c;导致训练过程中…

保姆级 -- Zookeeper超详解

1. Zookeeper 是什么(了解) Zookeeper 是一个 分布式协调服务 的开源框架, 主要用来解决分布式集群中应用系统的一致性问题, 例如怎样避免同时操作同一数据造成脏读的问题. ZooKeeper 本质上是 一个分布式的小文件存储系统 . 提供基于类似于文件系统的目录树方式的数据存储, …

【图论C++】链式前向星(图(树)的存储)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人…

基于微信小程序的刷题考试系统设计与实现(适用于各类考试类、答题类程序)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

【Ambari】银河麒麟V10 ARM64架构_安装Ambari2.7.6HDP3.3.1(HiDataPlus)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

pygame - 贪吃蛇小游戏

蛇每吃掉一个身体块&#xff0c;蛇身就增加一个长度。为了统一计算&#xff0c;界面的尺寸和游戏元素的位置都是身体块长度的倍数 1. 上下左右方向键&#xff08;或者ASDW键&#xff09;控制蛇的移动方向 2. 空格键暂停和继续图片文件&#xff0c;复制到项目的asset\img目录下i…

KUKA机器人通过3点法设置工作台基坐标系的具体方法

KUKA机器人通过3点法设置工作台基坐标系的具体方法 具体方法和步骤可参考以下内容: 进入主菜单界面,依次选择“投入运行”—“测量”—基坐标,选择“3点法”, 在系统弹出的基坐标编辑界面,给基座标编号为3,命名为table1,然后单击“继续”按钮,进行下一步操作, 在弹出的…