RFID差错检测--CRC码

在RFID系统中,由于多种原因(如电磁干扰、信号衰减等),可能会导致数据传输中出现错误。为了保证数据传输的可靠性,在发送和接收数据时需要进行差错检测。本文介绍一种基于多项式的编码技术——CRC码算法,它可以用来检测数据传输中的错误,并提供了一个实例和具体代码实现。

当使用无线电(radio)或蓝牙等技术进行数据传输时,因为信号衰减、噪声等问题,会导致数据传输中频繁出现错误。这时候可以采用CRC码算法来检测数据传输是否出现了错误。

一、CRC码算法原理

CRC码是基于多项式的编码技术。在多项式编码中,将信息位串看成阶次从 X k − 1 X^{k-1} Xk1 X 0 X^0 X0的信息多项式 M ( X ) M(X) M(X)的系数序列, M ( X ) M(X) M(X)的阶数为 k − 1 k-1 k1。在计算CRC码时,发送方和接收方必须采用一个共同的生成多项式 G ( X ) G(X) G(X) G ( X ) G(X) G(X)的阶数应该低于 M ( X ) M(X) M(X)且最高和最低阶的系数为1。

CRC码的算法步骤:

假设要发送长度为n的信息,其中k位为信息位,r位为检验位,总位数n=k+r

  1. k k k位信息写成 k − 1 k-1 k1阶多项式 M ( X ) M(X) M(X)
  2. 设生成多项式 G ( X ) G(X) G(X)的阶数位 r r r
  3. 用模2除法(异或)计算 X r M ( X ) / G ( X ) X^rM(X)/G(X) XrM(X)/G(X),获得余数多项式 R ( X ) R(X) R(X)
  4. 求得传送多项式 T ( X ) T(X) T(X), T ( X ) = X r M ( X ) − G ( X ) T(X)=X^rM(X)-G(X) T(X)=XrM(X)G(X), T ( X ) T(X) T(X)多项式系数序列的前 k k k位为信息位,后 r r r位为检验位

二、检验原理和编码优缺

①检验原理

T ( X ) T(X) T(X)一定能被 G ( X ) G(X) G(X)模2整除。接收端判断 T ( X ) T(X) T(X)是否能被 G ( X ) G(X) G(X)模2整除,进而判断传输途中是否出错。

  1. 如果计算得到的余数为0,则认为传输过程中没有发生错误。

  2. T ( X ) T(X) T(X)不能被 G ( X ) G(X) G(X)模2整除,那么说明接收到的信息存在错误,我们可以考虑以下两种情况:

    • 重新发送:如果实际传输的信息比较重要,我们可以选择重新发送该信息,以确保信息的完整性和正确性。
    • 错误纠正:此外,还可以使用一些纠错码技术来对接收到的信息进行错误纠正。

② 编码优点

识别错误的可靠性较好,且只需要少量的操作就可以实现。

③局限性和可能存在的问题:

  1. 多个错误位

CRC算法只能检测出数据传输中是否存在错误,但是当出现多个错误位时,它无法判断错误位的具体位置。例如,当数据传输过程中发生了两个或更多的错误时,CRC算法将无法正确地检测出这些错误位。

  1. 针对性攻击

CRC算法可能存在针对性攻击的风险,即攻击者通过故意构造特定的数据包来冒充合法数据,从而绕过CRC码检验。在应用CRC码检验时,应该采取其他安全措施来防止此类攻击。

  1. 数据长度限制

为了保证CRC校验码的可靠性,需要使用较长的生成多项式。当数据长度很短时,CRC校验码可能会占用相对较大的比例。因此,在短数据传输中使用CRC校验码可能会产生不必要的开销,这就需要在实际应用中权衡成本和收益。

  1. 可能出现误判情况

CRC算法只能检测出数据传输中是否存在错误,但并不能保证所有错误都能被检测出来。例如,如果生成多项式的阶数较小,CRC算法有可能出现误判情况,即无法检测出实际存在的错误。

三、案例

RFID差错检测--CRC码_第1张图片

注意:

① 将信息位串看成阶次从 X k − 1 X^{k-1} Xk1 X 0 X^0 X0的信息多项式 M ( X ) M(X) M(X)的系数序列,在其后面附加 l e n ( G ( X ) ) − 1 len(G(X))-1 len(G(X))1个0,保证总位数为 k + r k+r k+r

② 通常校验码的有效位数为 G ( X ) G(X) G(X)有效位数-1,不足则在前补 0 0 0

③ 进行异或操作时,从左边第一个1开始进行异或运算。

④ 每次异或前通过左移 G ( X ) G(X) G(X)使其与当前计算的字符串对齐。

四、python实现

def crc(str1: str, str2: str) -> dict:
    """自定义CRC计算校验码"""
    # str1附加len(str2)-1个0
    str = str1 + '0' * (len(str2) - 1)
    # 循环异或
    while len(str) >= len(str2):
        # 确保异或前左对齐(无前缀0),每次计算str需要左移多少位
        length = len(str) - len(str2)
        temp = int(str, 2) ^ (int(str2, 2) << length)
        # 每次异或结果str转二进制字符串(自动去除前缀0)
        str = bin(temp)[2:]
    # 补全校验码的有效位数为k-1
    k = len(str2)
    crc_len = k - 1
    crc_str = str.zfill(crc_len)
    # 返回一个字典,包含计算出来的校验码和发送的数据
    result = {'a': crc_str, 'b': str1 + crc_str}
    return result


l1 = crc('11110111', '10011')
print(f"校验码:{l1['a']},发送的数据是{l1['b']}")
print('----------------------')
l2 = crc('1011001', '11001')
print(f"校验码:{l2['a']},发送的数据是{l2['b']}")
print('----------------------')
l3 = crc('11010100', '11001')
print(f"校验码:{l3['a']},发送的数据是{l3['b']}")

五、运行结果

RFID差错检测--CRC码_第2张图片

你可能感兴趣的:(编码,算法,python)