CRC16 生成校验

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011862058/article/details/51832910


-(unsigned short)crc16

{

    Byte *bytes = (Byte *)[self bytes];

    uint16_t length = (uint16_t)[self length];

    return (unsigned short)CTtDlgANSI_CRC_16(bytes,  length);

//     return (unsigned short)CCheckSumCCITT_CRC_16(bytes,  length);

}

//CCITT V.41,x16 + x12 + x5 + 1

unsigned short CCheckSumCCITT_CRC_16(Byte* btData,int nLength)

{

    if((btData==NULL)||(nLength<=0))

    {

        NSLog(@"无效数组!");

        return -1;

    }


    unsigned short CRC=0;

    Byte j;

    int i;

    

    for(i=0;i<nLength;i++)

    {

        CRC^=(btData[i]<<8);

        for (j=0;j<8;j++)

        {

            if(CRC&0x8000)CRC=((CRC<<1)^0x1021);

            else          CRC<<=1;

        }

    }

    return ((CRC>>8)+(CRC<<8));/* 应用时低在先 */

}

unsigned short CTtDlgANSI_CRC_16(Byte * btData,int nLength) //ANSI CRC-16,x16 + x15 + x2 + 1

{

    if((btData==NULL)||(nLength<=0))

    {

        NSLog(@"无效数组!");

        return -1;

    }

    unsigned short CRC=0xFFFF;

    Byte j,Tmp=0;

    int i;

    for(i=0;i<nLength;i++)

    {

        CRC^=btData[i];

        for (j=0;j<8;j++)

        {

            Tmp=CRC&0x0001;

            CRC=CRC>>1;

            if(Tmp)CRC=(CRC^0xA001);

        }

    }

    return ((CRC>>8)+(CRC<<8)); /* 应用时高在先 */

}



猜你喜欢

转载自blog.csdn.net/u011862058/article/details/51832910