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,你需要做的第一件事就是指定哪个。该规范是多项式、输入和输出的反映、初始值和最终异或值。
这是我在 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,你需要做的第一件事就是指定哪个。该规范是多项式、输入和输出的反映、初始值和最终异或值。