首页 > 其他分享 >CRC 计算 C 语言例子

CRC 计算 C 语言例子

时间:2024-09-17 13:36:30浏览次数:1  
标签:语言 -- buf uint8 CRC 例子 div data uint32

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

void uint32_2_bin(char *buf, uint32_t val ){
    uint32_t b = 0x80000000;
    while(b>0){
        if( val&b ) *buf = '1';
        else *buf = '0';
        b>>=1;
        buf++;
    }
    *buf = '\0';
}

/**
 * param:
 *      data -- 需要计算的数组
 *      data_len -- 计算数组的长度
 *      div_e -- mod2 的除数
 *          如果公式为 X^8 + X^5 + X^4 + X
 *          那么 div_e == 0x131
 *      init -- 初始值,如果没有就填写 0x00
 *
 * 注意该函数目前是按照 crc8 的方式编写,
 * 通过变更返回值类型和 div_e 等变量可以变更成 crc16 crc32
 */
uint8_t mod2_division_8bits( uint8_t data[], uint32_t data_len, uint32_t div_e, uint8_t init ){
    uint8_t *end = data + data_len;
    uint32_t a = *data^init;

    uint8_t div_bits;
    uint32_t d;

    uint8_t b = 8;
    uint8_t c = 0;
    uint8_t sub;

#if 1
    {
        int i;
        for(i=0; i<32; i++)
            if( div_e & (0x01<<i) )
                div_bits = i+1;
        d = 0x01<<(div_bits-1);
    }
#else
    // fomule = X^8 + X^5 + X^4 + X;
    d = 0x100;
    div_bits = 9;
#endif

    while(1){
        if( b < div_bits ){
            if( data != end ){
                if( c > 0 ){
                    uint8_t bit = sub&c?1:0;
                    a = (a<<1)|bit;
                    c >>= 1;
                    if( a&d ) b++;
                }else{
                    data++;
                    sub = *data;
                    c = 0x80;
                    continue;
                }
            }else{
                if( c == 0 )
                    break;
                a <<= 1;
                c >>= 1;
                if( a&d ) b++;
            }
        }else{
            if( a&d )
                a ^= div_e;

            char s[64];
            uint32_2_bin( s, a );
            printf( "%s %2x\n", s, a );
            b--;
        }
    }

    return a&0xFF;
}

int main(void){

    uint8_t a[] = { 28, 184, 245, 165, 156, 208 };
    uint16_t b = 0x131;

    mod2_division_8bits( a, 6, b, 0xFF );

    return 0;
}

标签:语言,--,buf,uint8,CRC,例子,div,data,uint32
From: https://www.cnblogs.com/mojies/p/18417104

相关文章

  • 【C语言】函数与模块
    目录一、函数(Functions)1.1.函数的基本组成部分1.2.示例:一个简单的C函数1.3.函数调用和返回值二、模块(Modules)2.1.模块的基本构成2.2.C语言模块示例2.3.编译和链接三、使用场景3.1.函数的使用场景3.1.1.实现数学运算3.1.2.数据处理3.1.3.模块化编程3.1.......
  • 【Paper Reading】结合 NanoFlow 研究,优化大语言模型服务效率的探索
    作者王伟PAI引擎团队近年来,人工智能领域的快速发展推动了大型语言模型的广泛应用,随之而来的是对其服务效率的迫切需求。论文《NanoFlow:TowardsOptimalLargeLanguageModelServingThroughput》提出了一种突破性的新型服务框架,旨在提高大语言模型在实际应用中的服务吞吐量。这......
  • 信息学奥赛c++语言:求整数的和与均值
    题目描述读入n(1≤n≤10000)个整数,求它们的和与均值。输入输入第一行是一个整数n,表示有n个整数。第2~n+1行每行包含1个整数。每个整数的绝对值均不超过10000。输出输出一行,先输出和,再输出平均值(保留到小数点后5位),两个数间用单个空格分隔。样例输入 4344222343222......
  • 带你深入了解C语言指针(四)
    目录前言一、回调函数是什么?二、qsort使用1.什么是qsort2.qsort函数的语法解析3.回顾冒泡排序4.使用qsort函数排序整型数据4.1思路分析4.2完整代码:4.3总体逻辑展现5.使用qsort函数排序结构数据5.1strcmp()函数5.2思路分析5.2.1按名字比较5.2.2按年龄比较三、......
  • 计算机人工智能前沿进展-大语言模型方向-2024-09-17
    计算机人工智能前沿进展-大语言模型方向-2024-09-171.LargeLanguageModelsinBiomedicalandHealthInformatics:AReviewwithBibliometricAnalysisHYu,LFan,LLi,JZhou,ZMa,LXian,WHua,SHe…-JournalofHealthcare…,2024生物医学和健康信......
  • 文本多语言 AI 摘要 API 数据接口
    文本多语言AI摘要API数据接口文本/文本摘要AI生成文本摘要AI处理/智能摘要。1.产品功能支持多语言摘要生成;支持长文本处理;基于AI模型,持续迭代优化;不存储PDF文件,处理完即释放,保证您的文档安全;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼容Ap......
  • c语言中“函数指针”
    变量有地址,数组有地址,那么函数是否有地址呢?有intAdd(intx,inty){returnx+y;}intmain(){   pritnf("%p\n",&Add);   pritnf("%p\n",Add);  //&函数名和函数名都是函数的地址,没有区别。   return0;}若是想存放起来:int(*pf)(int,int)=&Add......
  • 超详细 正则表达式【源码解析+代码例子+图】
    由于正则表达式这个东西比较抽象,我推荐大家先看原理部分。在看原理部分如果有的表达式看不懂可以去下面看表,元字符这些东西还是比较好理解的。大家可以把我写的代码复制到编译器上跑一下,这样会更容易理解。一.基本介绍正则表达式就是用某一种模式去匹配字符串,筛选我们想要的......
  • 深入解析JSON:数据交换的通用语言
    目录1.引言2.JSON的起源3.JSON的结构4.JSON的优势5.JSON在软件开发中的应用5.1WebAPI5.2配置文件5.3数据存储6.使用JSON的最佳实践7.结论1.引言在当今的软件开发世界中,数据交换是应用程序之间通信的核心。随着WebAPI和微服务架构的兴起,一种轻量级的......
  • 关于IP地址、子网掩码、主机地址和网络地址的关系的详细例子
    前言:大家好很高兴我们又见面了,那么在这一篇博客中我将简单论述IP地址、子网掩码、主机地主和网络地址的关系.以及如何进行转换,方便大家理解与记忆.        :)关于IP地址、子网掩码、主机地主和网络地址的关系:####基本概念* **IP地址**:由32位(4个字节)组成,......