关于python实现CRC32的应用和总结

目前使用的Crc计算包含Crc32和Crc32mpeg2两种计算方式。

循环冗余检验 CRC 差错检测技术能够证明数据是完整的,是无差错的(只是非常近似的认为是无差错的)。

保证数据可靠性传输的方法包含如下:

  1. 检验和
    用循环冗余码Crc检验接收到的数据完整性,Crc计算结果完全一致表示数据是完整的,没有发生错位。
  2. 确认应答机制(ACK)
    TCP通过确认应答机制实现可靠的数据传输。在TCP的首部中有一个标志位——ACK,此标志位表示确认号是否有效。接收方对于按序到达的数据会进行确认,当标志位ACK=1时确认首部的确认字段有效。进行确认时,确认字段值表示这个值之前的数据都已经按序到达了。而发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据;而如果等待了一定时间还没有收到确认报文就会启动重传机制。
  3. 超时重传机制
    当数据发出后在一定的时间内未收到接收方的确认,发送方就会进行重传(通常是在发出报文段后设定一个特定的时间间隔,到点了还没有收到应答则进行重传)。

用python实现查表法计算Crc32的过程如下。

  1. 定义crc的table
origin_crc32_table = [
#/* CRC32生成多项式采用0x04C11DB7 */
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4]

  1. 编写创建crc32_table的函数。
def generate_crc32_table(_poly):global custom_crc32_table
​for i in range(256):c = i << 24
​for j in range(8):if (c & 0x80000000):c = (c << 1) ^ _polyelse:c = c << 1
​custom_crc32_table[i] = c & 0xffffffff

  1. 编写计算Crc32的函数。
def getCrc32(bytes_arr):length = len(bytes_arr)
​if bytes_arr != None:crc = 0xffffffff
​for i in range(0, length):#print i, getReverse(bytes_arr[i], 8)crc = (crc << 8) ^ custom_crc32_table[(getReverse(bytes_arr[i], 8) ^ (crc >> 24)) & 0xff]else:crc = 0xffffffff
​# /*- 返回计算的CRC值 */crc = getReverse(crc ^ 0xffffffff, 32)return crc
​
def getReverse(tempData, byte_length):reverseData = 0for i in range(0, byte_length):reverseData += ((tempData>>i)&1)<<(byte_length-1-i)
​return reverseData

当以上函数编写完成后,用如下代码进行检验

if __name__ == '__main__':a = 20b = 400s = struct.pack('>ii', a, b)print(s, type(s))
​s = struct.pack('<ii', a, b)print(s, type(s))
​print '反转方式LSB First,异或值为0xFFFFFFFF, test:'s = struct.pack('>i', 400)print ' 当前CRC输入初始值:', (s, type(s))test = binascii.crc32(s) & 0xffffffffprint '算出来的CRC值:', '0x'+"{:0>8s}".format(str('%x'%test))test = zlib.crc32(s) & 0xffffffffprint '算出来的CRC值:', '0x'+"{:0>8s}".format(str('%x'%test))
​crc32mpeg2_poly = 0x04C11DB7#buf = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36]#buf = [0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, 0x31, 0x32]#buf = [0x31, 0x32, 0x33]#buf = [0x31, 0x32]#buf = [0x31]buf_s = [0x00, 0x00, 0x01, 0x90]#buf_s = [0x90, 0x01, 0x00, 0x00]
​generate_crc32_table(crc32mpeg2_poly)print 'create_crc32_table:', " ".join('0x'+"{:0>8s}".format(str('%x'%i)) for i in custom_crc32_table)print 'origin_crc32_table:', " ".join('0x'+"{:0>8s}".format(str('%x'%i)) for i in origin_crc32_table)crc_stm = getCrc32(bytearray(buf_s)) & 0xffffffffprint ' 算出来的CRC值:', '0x' + "{:0>8s}".format(str('%x' % crc_stm))

查表法实现反正切_关于python实现CRC32的应用和总结相关推荐

  1. python查表法是什么_python查表法提取骨骼线经历

    首先根据这篇博文https://www.cnblogs.com/xianglan/archive/2011/01/01/1923779.html,自己重新编写python代码,由于出现局部错误,导致出 ...

  2. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  3. VTK修炼之道23:图像基本操作_灰度图像映射成伪彩色图像(查表法)

    1.查表法伪彩图映射 图像彩色映射的原理是首先生成一个颜色查找表,然后根据图像的一个标量值向颜色查找表中查找对应的颜色,并用新颜色值替代原来的像素值.VTK中vtkImageMapToColors负责 ...

  4. crc16码表的使用_查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  5. 常用crc查表法_查表法计算CRC

    (查表法)CRC检验码的计算过程 (1)将上次计算出的CRC校验码右移一个字节: (2)将移出的这个字节与新的要校验的字节进行XOR 运算: (3)用运算出的值在预先生成码表中进行索引,获取对应的值( ...

  6. 常用crc查表法_请教查表法计算CRC的原理

    自己写过的, 希望对你有帮助 Cyclic Redundancy Check(CRC) 原理及实现 /// 1: 需求 在数据传送过程中,为了能够进行错误检测, 往往在数据后追加一些检测码, 当接受方 ...

  7. arctan查表法_查表法

    查表法是将一些事先计算好的结果,存储在常量数组中,运行时节省计算开销. 例如, 计算字节中位1的个数, int countBits( unsigned char dat ) { static char ...

  8. 单片机c语言NTC温度查表程序,STM32查表法读NTC值并显示温度

    STM32查表法读NTC值并显示温度 #include "stm32f10x.h"Y'+F0IZ+ #include "delay.h"pU'`9fLi_ #i ...

  9. CRC16查表法原理

    Preface CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结. 一.CRC校验 ...

最新文章

  1. gta5结局杀老崔我哭了_都已经2020年了,怎么还有人在买GTA5?
  2. 【Fedora20】 samba配置
  3. 数学教育中的AI:NeurIPS’21 Workshop 欢迎投稿!
  4. Linux 进程管理控制
  5. shell开启飞行模式_手机飞行模式,太神奇了,今天总算明白了,不用真是太浪费了...
  6. Spring+MyBatis企业应用实战 - 笔记- Java EE应用
  7. Spring 基于注解的AOP实现
  8. 通过Spring Boot中的手动Bean定义提高启动性能
  9. Win10企业版激活方法
  10. 【ubuntu20】虚拟机下ubuntu联网
  11. 工业相机和镜头主要参数解释
  12. Python学习笔记---day06数据类型(中)
  13. sql 错误码 备用
  14. “Win10 无法使用内置管理员账户打开(应用程序)“怎么办
  15. linux fontconfig字体报错问题
  16. 写作者网新浪微博通过认证加V
  17. 别再说你不会,规则引擎Drools了
  18. 代谢组学数据处理软件——NormalizeMets
  19. python 绘制五星红旗(包含三角函数)
  20. 变强——GitHub 热点速览 Vol.46

热门文章

  1. python中ascii码和字符的转换
  2. ubuntu vnc 远程连接桌面
  3. vue的使用(引用/创建vue项目)(一)
  4. 产品经理经验谈100篇(八)-产品经理分析框架解析
  5. wordpress archive.php,wordpress分类目录模板(archive.php)制作
  6. swift x输入流_Swift 中不同窗体的切换和传递数据 (segue 的用法)
  7. jsp实现数据禁用和只读
  8. 话筒好坏测试软件,如何简单地判断麦克风的质量好坏?
  9. php 运算验证码类,php 数学运算验证码实现代码
  10. ant vue 兼容性问题_ant design for vue 关于table的一些问题