首页 > 其他分享 >CRC计算

CRC计算

时间:2022-12-22 07:44:05浏览次数:48  
标签:srcBuf unsigned 0x12 char CRC 计算 0x48

参考,(159条消息) CRC16常见几个标准的算法及C语言实现_leumber的博客-CSDN博客_crc16

#include<stdio.h>
/****************************Info********************************************** 
 * Name:    InvertUint8 
 * Note:     把字节颠倒过来,如0x12变成0x48
            0x12: 0001 0010
            0x48: 0100 1000
 *****************************************************************************/
void InvertUint8(unsigned char *dBuf,unsigned char *srcBuf)
{
    int i;
    unsigned char tmp[4]={0};
 
    for(i=0;i< 8;i++)
    {
        if(srcBuf[0]& (1 << i))
        tmp[0]|=1<<(7-i);
    }
    dBuf[0] = tmp[0];
    
}

void InvertUint16(unsigned short *dBuf,unsigned short *srcBuf)
{
    int i;
    unsigned short tmp[4]={0};
 
    for(i=0;i< 16;i++)
    {
        if(srcBuf[0]& (1 << i))
        tmp[0]|=1<<(15 - i);
    }
    dBuf[0] = tmp[0];
}

/****************************Info********************************************** 
 * Name:    CRC-16/CCITT        x16+x12+x5+1 
 * Width:    16
 * Poly:    0x1021 
 * Init:    0x0000 
 * Refin:   True 
 * Refout:  True 
 * Xorout:  0x0000 
 * Alias:   CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT 
 *****************************************************************************/ 
unsigned short CRC16_CCITT(unsigned char *data, unsigned int datalen)
{
    unsigned short wCRCin = 0x0000;
    unsigned short wCPoly = 0x1021;
    unsigned char wChar = 0;
    
    while (datalen--)     
    {
        wChar = *(data++);
        InvertUint8(&wChar,&wChar);
        wCRCin ^= (wChar << 8);
        for(int i = 0;i < 8;i++)
        {
            if(wCRCin & 0x8000)
                wCRCin = (wCRCin << 1) ^ wCPoly;
            else
                wCRCin = wCRCin << 1;
        }
    }
    InvertUint16(&wCRCin,&wCRCin);
    return (wCRCin);
}

int main()
{
    unsigned char buf[2]={1,2};
    unsigned short crc16=CRC16_CCITT(buf, 2);
    printf("%x", crc16);
}

 

标签:srcBuf,unsigned,0x12,char,CRC,计算,0x48
From: https://www.cnblogs.com/yanhc/p/16997540.html

相关文章

  • POWERBI#利用EOMONTH,计算月度时间进度
    需求:计算本月的时间进度需要测算两个值,一个是当日的累积天数,第二个是当月的总共天数,两者相除即是最终答案1:计算当日的累积天数=DAY(NOW())由筛选器传递时间参数,NOW函数返回......
  • 谈谈流计算中的『Exactly Once』特性
    本文翻译自streaml.io网站上的一篇博文:“ExactlyonceisNOTexactlythesame”,分析了流计算系统中常说的『ExactlyOnce』特性,主要观点是:『精确一次』并不保证是完......
  • Unity AssetBundle 所涉及的CRC
    CRC的作用校验文件是否被篡改过!加载ab包时使用crc进行校验比如publicstaticAssetBundleLoadFromFile(stringpath,uintcrc,ulongoffset),注意:这里传入的crc,必......
  • 计算机组成与设计:笔记
    ComputerOrganizationandDesign目录ComputerOrganizationandDesignSec1Abstraction1.2EightGreatIdeasinComputer1.3BelowyourProgram1.6Performance(K......
  • 计算机网络基础--华为设备配置
    TCP/IP协议栈:   应用层   传输层   网络层   网络接口层1.TCP协议: 序列号:表示该协议为所要传输数据的每一个字节做一个序号,即一个字节的数据对......
  • 计算机组成原理
    1.闪速存储器是一种高密度,非易失性的只读半导体存储器.2.虚拟段页式存储管理方案的特点为空间浪费小,存储保护容易,存储共享容易,能动态连接3.双端口存储器由于同一个存储......
  • ODE初值问题常用数值计算方法
    ​ 待求解的ODE:前向Euler法: 梯形法(改进Euler法/Henu方法): 后向Euler法:​......
  • lightdb相关系数计算函数corr
    相关系数是最早由统计学家卡尔·皮尔逊设计的统计指标,是研究变量之间线性相关程度的量,一般用字母r表示。由于研究对象的不同,相关系数有多种定义方式,较为常用的是皮尔......
  • 远程计算机已加入AAD凭据不工作
    远程计算机已加入AAD凭据不工作解决方法计算机需要加入AAD(AzureActiveDirectory)设置-账户-其他用户-连接工作或学校用户-连接在下方的【替代操作】中选......
  • 【笔记】并行计算和MPI
    并行计算有三个层次。进程级并行:通过网络连接在不同计算节点之间传送数据,内存不共享。线程级并行:共享内存。线程内并行:向量化指令级并行。并行编程的基本方法就是分解和协......