Linux C——常用校验方法

1.奇偶校验

    奇偶校验是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶 校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校 验“1”的个数是否为奇数,从而确定传输代码的正确性。

奇校验:所有传送的数位(含字符的各数位和校验位)中,1”的个数为奇数,如:

 1 01100101 0 01100001

偶校验:所有传送的数位(含字符的各数位和校验位)中,1”的个数为偶数,如:

 1 01000101 0 01000001

奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。

unsigned int v;       // 待检测的数字
bool parity = false;  //初始判断标记
while (v)
{
  parity = !parity;
  v = v & (v - 1);
}

通过while循环,每执行一次,v1的数目就会减少1,如果v1的数目为奇数,则parity=true,否则parity=false

 

2.CRC校验

实现方法:这是利用除法及余数的原理来进行错误检测的.将接收到的码组进行除法运算,如果除尽,则说明传输无误;如果未除尽,则表明传输出现差错。crc校验还有自动纠错能力。

crc检验主要有计算法和查表法两种方法

适用范围:CRC-12码通常用来传送6-bit字符串;CRC-16CRC-CCITT码则用是来传送

8-bit字符。CRC-32:硬盘数据,网络传输等

unsigned int cal_crc(unsigned char *ptr, unsigned char len)
{
    unsigned char i;
    unsigned int crc=0;
while(len--!=0)
 {
        for(i=0x80; i!=0; i/=2)
        {
            if((crc&0x8000)!=0)
            {
                crc*=2;
                crc^=0x1021;
            } /* 余式CRC乘以2再求CRC */
            else
            {
                crc*=2;
            }
            if((*ptr&i)!=0)
            {
                crc^=0x1021;
            }/* 再加上本位的CRC */
        }
        ptr++;
    }
    return(crc);
}

3.校验和

    校验和,在数据处理和数据通信领域中,用于校验目的地一组数据项的和。它通常是以十六进制为数制表示的形式。如果校验和的数值超过十六进制的FF,也就是255. 就要求其补码作为校验和。通常用来在通信中,尤其是远距离通信中保证数据的完整性和准确性。

unsigned char Check(unsigned char *buf, int len)  
{  
    int iSum = 0;  
    int iTemp = 0;  
    CString str;  
    for (int i = 0;i < len;i++)  
    {  
        iSum += buf[i];  
    }  
    iSum %= 0x100;  
return (unsigned char)iSum;
}

4.异或校验

它就是把所有数据都和一个指定的初始值(通常是0)异或一次,最后的结果就是校验值,通常把它附在通讯数据的最后一起发送出去。接收方收到数据后自己也计算一次异或和校验值,如果和收到的校验值一致就说明收到的数据是完整的。

unsigned char CheckXor(char *strData,int len)  
{  
    char checksum = 0;  
    for (int i = 0;i < len;i++)  
    {  
        checksum = checksum ^ strData[i];  
    }  
    return (unsigned char)checksum;  
}  


5.汉明校验

Richard Hamming1950年提出、目前还被广泛采用的一种很有效的校验方法,是只要增加少数几个校验位,就能检测出二位同时出错、亦能检测出一位出错并能自动恢复该出错位的正确值的有效手段,后者被称为自动纠错。它的实现原理,是在k个数据位之外加上r个校验位,从而形成一个k+r位的新的码字,使新的码字的码距比较均匀地拉大。把数据的每一个二进制位分配在几个不同的偶校验位的组合中,当某一位出错后,就会引起相关的几个校验位的值发生变化,这不但可以发现出错,还能指出是哪一位出错,为进一步自动纠错提供了依据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值