python 中的 CRC 实施

CRC implementation in python

这是我在 python 中实现 CRC 的代码:

import math

divisors  = [0b1100000001111, 0b11000000000000101, 0b10001000000100001, 0b1011, 0b10011,0b00000111, 0b11001]

def get_Length(arg):
    return math.floor(math.log2(arg)) +1

def CRC(message, type):
    print("Message ",bin(message)[2:], hex(message))
    # int message_length = get_Length(message);
    divisor_length = get_Length(divisors[type])
    divisor = divisors[type]
    print("Divisor: ",bin(divisor)[2:], hex(divisor))
    message = message << (divisor_length-1)

    old_message = message
    while( (message >> (divisor_length-1)) !=0 ):
        ml = get_Length(message)

        divisor_copy = divisor << (ml-divisor_length)

        message = message ^ divisor_copy

    print(bin(message)[2:], hex(message))
    print(bin(old_message| message)[2:], hex(old_message|message), end="\n\n")

def main():
   CRC(0b1101011011, 4)
   CRC(0x34ec, 1)
main()

第一条消息来自Wikipedia example and gives the correct result. However the second one (x34ec), which demonstrates a CRC-16 is not giving the correct result (correct result)。我也附上了输出快照:

.

如果有人能对此有所启发,我们将不胜感激。

提前致谢。

有很多 CRC-16。我数 30 here alone,而且我确定还有更多未在该目录中使用的产品。

您实施的是那个目录中的CRC-16/UMTS,也称为CRC-16/BUYPASS和CRC-16/VERIFONE。它是最直接的定义,不反映位入和位出,初始值为零,并且没有最终的异或。

您在消息 34 ec 上实施的结果 CRC 实际上可以 直接在您链接的“正确结果”中找到,在 table 标记为“CRC-16/BUYPASS”。

如果你想实现一个不同的 CRC-16,你需要做的第一件事就是指定哪个。该规范是多项式、输入和输出的反映、初始值和最终异或值。