(iOS)CRC16算法之一:CRC16-CCITT-FALSE算法的OC实现

公司在做物联网这块,然后硬件工程师今天告诉我要给蓝牙发送十六进制,来校验时间,需要用到CRC16-CCITT-FALSE校验,当时我就懵了,第一次做蓝牙,第一次听说CRC16-CCITT-FALSE校验算法,度娘了半天,结果只有Java和C的校验代码,没有OC的校验代码,没办法了,只能把C的代码改成OC的了

- (NSString *)CRCSumString

{

    BytecrcByte[2] = {0x00,0x00};

    unsignedintcrcInt = [selfcrcData];

    memcpy(&crcByte, &crcInt,2);

    return[NSStringstringWithFormat:@"%2X%2X", crcByte[0], crcByte[1]];

}

- (unsigned short)crcData{

    int start = 0; //选择数据要计算CRC的起始位

    intend = (uint16_t)[selflength];//选择数据要CRC计算的范围段

    unsigned short  crc =0xffff; // initial value

    unsignedshort  polynomial =0x1021;// poly value

    BytecodeKeyByteAry[self.length];

    for(inti =0; i

        NSData *idata = [self subdataWithRange:NSMakeRange(i, 1)];

        codeKeyByteAry[i] =((Byte*)[idatabytes])[0];

    }

    for(intindex = start; index < end; index++){

        Byteb = codeKeyByteAry[index];

        for(inti =0; i <8; i++) {

            Booleanbit = ((b >> (7- i) &1) ==1);

            Booleanc15 = ((crc >>15&1) ==1);

            crc <<=1;

            if(c15 ^ bit)

                crc ^= polynomial;

        }

    }

    crc &=0xffff;

    returncrc;

}

Git下载地址:GitHub - xiaoUnique0206/CRCTest: CRC

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CRC16-CCITT-FALSE算法是一种循环冗余校验算法,用于检测数据传输过程中的错误。它采用16位的校验码,基于多项式x^16+x^12+x^5+1进行计算。该算法常用于串口通信、网络通信等领域。 ### 回答2: CRC16-CCITT-False算法是一种循环冗余校验算法,用于检测数据传输中的错误。它是CCITT(国际电话与电报咨询委员会)在计算校验和时所推荐的一种标准,也是广泛应用于通信领域的一种校验算法。 这种算法使用16位的生成多项式(0x1021),通过对待校验的数据进行位运算来计算出一个16位的校验值。具体操作过程如下: 首先,将生成多项式(0x1021)左移8位,并与待校验数据的最高位进行异或运算,然后将结果与生成多项式继续异或运算。这样一直重复,直到将所有的位都进行了异或运算。 最后,将生成多项式右移8位,并将结果与前一步得到的结果进行异或运算,然后继续进行右移和异或运算,直到右移8次,得到最终的16位校验值。 CRC16-CCITT-False算法的特点是具有较高的错误检测能力和良好的性能。它能够检测出大部分单比特和双比特错误,并且在数据长度较短的情况下,也能够有效地检测出更多的错误。因此,在通信领域,特别是在串行通信和网络传输中,广泛使用CRC16-CCITT-False算法来保障数据的可靠性。 总之,CRC16-CCITT-False算法是一种可靠的循环冗余校验算法,通过对待校验数据进行位运算,得到一个16位的校验值,用于检测数据传输中的错误。它的高效性和可靠性使得它成为通信领域中常用的校验算法之一。 ### 回答3: CRC16-CCITT-FALSE算法是一种循环冗余校验算法,用于检验传输或存储的数据是否出现错误。它采用16位的校验和,并遵循CCITT (Comité Consultatif International Téléphonique et Télégraphique)标准,但结果会与标准的CRC16-CCITT算法稍有不同。 该算法使用多项式生成器x^16 + x^12 + x^5 + 1,内部计算步骤如下: 1. 首先,将要校验的数据按照字节划分,并将每个字节转换为二进制形式。 2. 初始化CRC寄存器为0xFFFF(16个1)。 3. 逐位地处理每个字节,从高位到低位: 3.1 对CRC寄存器的高8位与当前字节进行按位异或运算。 3.2 然后,对CRC寄存器的低8位与一个字节0x00进行按位异或运算。 3.3 循环8次,每次右移一位,若最低位为1,则与生成器多项式进行按位异或运算。 4. 继续处理下一个字节,重复步骤3。 5. 最后,对CRC寄存器进行按位取反运算,即得到校验码。 由于CRC16-CCITT-FALSE算法不使用任何位倒序或字节倒序操作,被称为“false”。该算法常用于通信和数据传输中,用于检验数据的完整性和准确性,一旦校验码不匹配,就表明数据在传输或存储过程中出现了错误,需要重新发送或进行修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值