CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。原理参考链接
def crc_remainder(input_bitstring, polynomial_bitstring, initial_filler):
"""Calculate the CRC remainder of a string of bits using a chosen polynomial.
initial_filler should be '1' or '0'.
"""
polynomial_bitstring = polynomial_bitstring.lstrip('0')
#1011
len_input = len(input_bitstring)
#14
initial_padding = (len(polynomial_bitstring) - 1) * initial_filler
#000
input_padded_array = list(input_bitstring + initial_padding)
"""
['1', '1', '0', '1', '0', '0', '1', '1', '1', '0', '1',
'1', '0', '0', '0', '0', '0']
"""
while '1' in input_padded_array[:len_input]:
cur_shift = input_padded_array.index('1')
print "cur_shift = ",cur_shift
for i in range(len(polynomial_bitstring)):
input_padded_array[cur_shift + i] = str(int(polynomial_bitstring[i] != input_padded_array[cur_shift + i]))
print "input_padded_array",input_padded_array
return ''.join(input_padded_array)[len_input:]
print(crc_remainder('11010011101100', '1011', '0'))
While循环次数:有多少个1循环几次
For循环次数:polynomial_bitstrin 的长度
整个循环过程打印:
cur_shift = 0
input_padded_array ['0', '1', '0', '1', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '1', '0', '1', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '1', '1', '1', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '1', '1', '0', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
cur_shift = 1
input_padded_array ['0', '0', '1', '0', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '1', '0', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '1', '1', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '1', '1', '1', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
cur_shift = 2
input_padded_array ['0', '0', '0', '1', '1', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '1', '1', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '1', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '1', '0', '1', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
cur_shift = 3
input_padded_array ['0', '0', '0', '0', '0', '1', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '1', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '1', '1', '0', '0', '0', '0', '0']
cur_shift = 7
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '1', '0', '0', '0', '0', '0']
cur_shift = 8
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0', '0', '0', '0', '0']
cur_shift = 9
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '0', '0', '0', '0']
cur_shift = 10
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '1', '0', '0', '0']
cur_shift = 11
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0']
input_padded_array ['0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '0', '0']
100
def crc_check(input_bitstring, polynomial_bitstring, check_value):
"""Calculate the CRC check of a string of bits using a chosen polynomial."""
polynomial_bitstring = polynomial_bitstring.lstrip('0')
len_input = len(input_bitstring)
initial_padding = check_value
input_padded_array = list(input_bitstring + initial_padding)
while '1' in input_padded_array[:len_input]:
cur_shift = input_padded_array.index('1')
for i in range(len(polynomial_bitstring)):
input_padded_array[cur_shift + i] = str(int(polynomial_bitstring[i] != input_padded_array[cur_shift + i]))
return('1' not in ''.join(input_padded_array)[len_input:])
print(crc_check('11010011101100', '1011', '100'))
#True