CRC-32 algorithm||CRC32校验算法实现python

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

 

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