原文出处: https://xugaoxiang.com/2019/12/08/python-crc/

软硬件环境

  • ubuntu 18.04 64bit
  • anaconda with python 3.6
  • pycrc

CRC简介

CRCCyclic Redundancy Check的缩写,中文叫循环冗余校验,维基百科的定义是这样的

是一种根据网上数据包或计算机文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的计算机硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。

总结一下,CRC就是确保数据经过传输或保存后的正确性的一种方法。

python中使用CRC

这里介绍两种情况,其一,不关心具体的CRC算法实现,那我们就用现成的第三方库pycrc;另一种就是基于私有的CRC算法,你可以根据自己的需要实现自定义。

pycrc

安装pycrc

pip install pycrc

实例代码

xugaoxiang@ubuntu:~$ ipython3
Python 3.6.6 |Anaconda custom (64-bit)| (default, Oct  9 2018, 12:34:16)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.In [1]:                                                                                                            In [1]: from PyCRC.CRC16 import CRC16 ...: from PyCRC.CRC16DNP import CRC16DNP ...: from PyCRC.CRC16Kermit import CRC16Kermit ...: from PyCRC.CRC16SICK import CRC16SICK ...: from PyCRC.CRC32 import CRC32 ...: from PyCRC.CRCCCITT import CRCCCITT                                                                        In [2]: input = '12345'                                                                                            In [3]: CRC16().calculate(input)
Out[3]: 42069In [4]: CRC32().calculate(input)
Out[4]: 3421846044In [5]: CRCCCITT().calculate(input)
Out[5]: 21612In [6]: CRC16DNP().calculate(input)
Out[6]: 7281In [7]: CRC16Kermit().calculate(input)
Out[7]: 14196In [8]: CRC16SICK().calculate(input)
Out[8]: 5264
调用私有的CRC算法

在某些场景下(如早些年的嵌入式领域),会自己去实现一套私有的CRC算法,一般是基于C语言编写,这样的话,如果需要在python中实现调用,就需要自己去编译成动态库,然后在python中使用。如下是一段C代码,它的核心其实是crc_table,在嵌入式设备中,一般都是将crc_table预先计算好,crc_table不同,最后的结果也不一样。

/*crc*/
/* crc32.c -- compute the CRC-32 of a data stream* Copyright (C) 1995-1998 Mark Adler* For conditions of distribution and use, see copyright notice in zlib.h */static const unsigned int crc_table[256] = {0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,0x2d02ef8dL
};#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
#define DO2(buf)  DO1(buf); DO1(buf);
#define DO4(buf)  DO2(buf); DO2(buf);
#define DO8(buf)  DO4(buf); DO4(buf);
unsigned int mtd_crc32(unsigned int crc, const char *buf, int len)
{crc = crc ^ 0xffffffffL;while (len >= 8){DO8(buf);len -= 8;}if (len) do {DO1(buf);} while (--len);return crc ^ 0xffffffffL;
}

第一步将C代码编译成动态链接库

gcc -fPIC -shared -o libcrc.so crc.c

接着编写python模块crc.py, 这里使用了platform来区分系统是32位的还是64位的,方便跨平台

# -*- coding: utf-8 -*-"""
@author: djstava
@license: MIT Licence
@contact: djstava@gmail.com
@site: https://www.xugaoxiang.com
@software: PyCharm
@file: crc.py
@time: 11/11/18 4:48 PM
"""import platform
from ctypes import *class Crc(object):def __init__(self):pass@classmethoddef calcStrCRC(self,buffer,size):'''调用外部so,计算crc值:param buffer: bytes-like类型:param size::return:'''if platform.architecture()[0] == '64bit':handle = cdll.LoadLibrary('libcrc_64.so')else:handle = cdll.LoadLibrary('libcrc.so')func = handle.mtd_crc32func.argtypes = (c_uint,c_void_p,c_int)func.restype = c_uintcrc = func(0,buffer,size)return crc

参考资料

  1. https://zh.wikipedia.org/wiki/循環冗餘校驗
  2. https://pypi.org/project/PyCRC/

在Python中使用CRC进行数据校验相关推荐

  1. python 获取金融数据_class类在python中如何获取金融数据

    class类在python中如何获取金融数据 发布时间:2020-12-11 11:12:06 来源:亿速云 阅读:101 作者:小新 这篇文章主要介绍了class类在python中如何获取金融数据, ...

  2. Brats2020数据集的读取—>python中对.nii格式数据读取

    Brats2020数据集的读取->python中对.nii格式数据读取 首先要安装了torchio,安装指令: pip install torchio torchio:一个 Python 库,用 ...

  3. 在Python中FITS格式文件数据的读取 (转载)

    在Python中FITS格式文件数据的读取 (转载) 前言 \space\space\space\space     FITS(Flexible Image Transport System)格式文件 ...

  4. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  5. 在Python中读取MATLAB的数据文件

    简 介: 本文测试了几种通过python直接读取MATLAB的**.MAT格式的数据文件,有些方法经过测试发现无法完成.而通过mat4py可以比较方便的读取MATLAB中的数据文件.利用手边已有的用于 ...

  6. python创建csv文件并写入-【已解决】Python中创建和保存数据到csv文件中

    此处希望在python中,将A和B的QA对话,中错误的对话,保存到csv中. 打算自己先创建一个csv文件,然后后续每个对话出错的话,就append追加写入到csv中. 其中希望用逗号分隔.而句子中如 ...

  7. list可以存放python中任意类型的数据_Python中常见的数据类型小结

    Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这几种一一介绍: 一 序列 1.列表list 列表是一种有序的 ...

  8. python中的保护对象数据

    保护对象数据 查看过着修改对象的属性(数据),有2种方法. 直接通过对象名修改 通过方法间接修改 Python中没有像C++中public和private这些关键字来区别公有属性和私有属性.它是以属性 ...

  9. python中不同类型的数据不能相互运算_Python第三课——数据类型与运算(2)

    hello大家好,我是你们的小蒟蒻鸭,终于终于有时间写博客了(虽然刚开始期末复习),真的非常非常抱歉,拖更太厉害了.反正还有一个月不到小蒟蒻就要放暑假了!!!(激动.jpg),蒟蒻保证会一周两篇,绝不 ...

最新文章

  1. 1-runtime的Method,IMP,Property,ivar
  2. 织梦dedecms如何快速使用拼音首字母做栏目名称
  3. Github上 10 个超好看可视化面板
  4. Exchange Server 2013之CAS服务器NLB负载均衡
  5. 【工作感悟】mysql授权root远程访问
  6. appium 移动端自动化测试工具(4)
  7. 【Matlab】函数输入个数不定怎么办?
  8. UI framework显示message technical information的实现
  9. Simple-Faster-RCNN源码学习笔记
  10. leetcode 140. 单词拆分 II(记忆化)
  11. 【华为云技术分享】从部署和运维说说DLI(1)
  12. Unity学习日志_全局光照GI系统简介
  13. php阿里云短信验证码
  14. PPT模板 | 红色学术风论文答辩PPT模板
  15. Win10安装Fliqo翻页时钟屏保
  16. python游戏编程
  17. 工程伦理(李正风)——第一章习题
  18. ★电车难题的n个坑爹变种
  19. 《Microsoft COCO Captions Data Collection and Evaluation Server》论文笔记
  20. 如何对电脑里越来越多的文件进行管理,分类最重要

热门文章

  1. 时间的增加,减少,以及时间差
  2. MySql 数据库查看视图的创建sql语句
  3. sprintf用法大全
  4. 字符设备编程(四)之可爱的 misc
  5. 7-4 期刊收费 (10分)
  6. 设置或恢复Windows10字体的小工具
  7. Ubuntu 获取超级权限
  8. OPENCV相关读书笔记
  9. 苹果屏幕旋转怎么设置?关于苹果手机设置的一些小技巧
  10. 主动学习之Alipy包使用 (三):实例选择实验