微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python中的CRC实现

如何解决python中的CRC实现

这是我在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 并给出了正确的结果。然而,第二个 (x34ec) 表明 CRC-16 没有给出正确的结果 (correct result)。我还附上了输出快照:

enter image description here

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

提前致谢。

解决方法

有很多 CRC-16。我数了 30 here alone,我确信还有更多正在使用中,但不在该目录中。

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。