CRC

//CRC16校验

ushort CRC16Valid(const TByteDynArray buffer, int len)

{

    ushort crc = 0, tmp;

    int index = 0;

    while(len--)

    {

        tmp = buffer[index++];

        crc = crc ^ (tmp <<8);

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

        {

            if (crc & 0x8000)

                crc = (crc <<1) ^ 0x1021;

            else

                crc <<= 1;

        }

    }

    crc = (crc >> 8) | (crc<< 8);

    return(crc);

}

//---------------------------------------------------------------------------

//CRC16校验

ushort CRC16Valid(const uchar* buffer, int len)

{

    ushort crc = 0, tmp;

    while(len--)

    {

        tmp = *buffer++;

        crc = crc ^ (tmp <<8);

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

        {

            if (crc & 0x8000)

                crc = (crc <<1) ^ 0x1021;

            else

                crc <<= 1;

        }

    }

    crc = (crc >> 8) | (crc<< 8);

    return(crc);

}

 

//异或校验

void XORValid(const TByteDynArray buffer, int len)

{

    char checksum = 0, cr = 13, ln =10;

    char ch1,c1; //校验位的高四位和第四位

    for (int i = 0;  i<len; i++)

    {

        checksum = checksum ^buffer[i+1]; //进行异或交验取值

    }

 

    ch1 = (checksum  >> 4) & 0x0F;  //取高位数;

    c1 = checksum & 0x0F; //取低位数;

 

    if (ch1 < 10) //低于10的数

        ch1 = ch1  +  '0';

    else

        ch1 = (ch1 - 10 ) +  'A'; //不低于10的16进制数,如:A、B、C、D、E、F

 

    if (c1 < 10)

        c1 = c1  +  '0';

    else

        c1 = (c1 - 10 )+  'A';

 

   XOR_High=ch1;

   XOR_Low =c1;

}

 

//-----------------------------------------------------------------------------

//异或校验

void XORValid(const uchar* buffer, int len)

{

    charchecksum = 0, cr = 13, ln = 10;

    charch1,c1; //校验位的高四位和第四位

    for (inti = 0;  i<len;  i++)

    {

        checksum = checksum ^ buffer[i+1]; //进行异或交验取值

    }

 

    ch1 =(checksum  >> 4) & 0x0F; //取高位数;

    c1 =checksum & 0x0F;  //取低位数;

 

    if (ch1< 10) //低于10的数

        ch1= ch1  + '0';

    else

        ch1= (ch1 - 10 ) +  'A'; //不低于10的16进制数,如:A、B、C、D、E、F

 

    if (c1 < 10)

        c1 = c1  +  '0';

    else

        c1 = (c1 - 10 )+  'A';

 

    XOR_High=ch1;

    XOR_Low =c1;

}

03-08
### CRC循环冗余校验算法解释 CRC校验基于GF(2)多项式算术,即模-2除法的余数运算,实质上是异或操作[^1]。此方法通过在原始数据之后附加一定数量的冗余位来形成完整的传输单元,这些冗余位用于差错检测。 对于长度为\( k \)的数据序列,在其后添加 \( r \)个比特作为冗余码,使得整个消息变为 \( n=k+r \)比特长,并以此形式发送出去。这里存在一个最高次幂等于\( n-k=r \) 的多项式\( G(x) \),依据该多项式可生成对应的校验码。当涉及到实际应用时,比如在网络通信领域内,\( k \)往往非常大,可能达到上千乃至数千比特,此时常选用16位的标准生成多项式如CRC-16 或者 CRC-CCITT 来创建校验位[^2]。 #### C语言中的CRC实现示例 下面给出一段简单的C语言代码片段用来展示如何利用指定的生成多项式计算CRC值: ```c #include <stdio.h> #define POLYNOMIAL 0xA001 /* 这里定义了一个常见的16-bit CRC多项式的反向表示 */ unsigned short crc16(const unsigned char *data, int length){ unsigned short crc = 0xFFFF; while(length--){ crc ^= (*data++) << 8; // 将当前字节加入到crc中 for(int i=0;i<8;++i){ if(crc & 0x8000) crc=(crc<<1)^POLYNOMIAL; else crc=crc<<1; } } return crc; } int main(){ const char* message="hello world"; printf("CRC16 of '%s' is %04X\n",message,crc16((const unsigned char*)message,strlen(message))); return 0; } ``` 上述程序展示了怎样针对给定字符串计算其CRC16校验值的过程。注意这里的`POLYNOMIAL`被设为了十六进制数值`0xA001`,这代表了一种特定类型的CRC-16标准——反转后的版本。此外,这段代码还体现了基本的移位和按位逻辑运算技巧,这些都是执行CRC计算所必需的操作[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值