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

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值