博客
关于我
CRC32计算方法
阅读量:239 次
发布时间:2019-03-01

本文共 1765 字,大约阅读时间需要 5 分钟。

最近在项目中需要使用crc32计算校验和,首先尝试使用Python3的zlib库,通过zlib.crc32()函数计算得到校验和为1089448862作为参考值。接着尝试使用网上找到的C代码,结果发现计算结果与Python3的结果不符。于是决定从zlib源码入手,深入探索crc32的实现原理。

在Python3中,使用zlib.crc32()函数计算校验和非常简单,直接调用函数即可得到结果。例如:

import zlibbytesData = b"\x01\x02\x03\x04\x05\x06\x07\x08\x09"retCRC = zlib.crc32(bytesData, 0)print("{}".format(retCRC))

运行后,返回的校验和为1089448862。

接下来尝试使用zlib的C库进行计算。在Linux下,下载并编译zlib-1.2.11,使用CMake编译项目。编译完成后,发现通过自定义的main.c程序调用crc32函数,结果与Python3的结果一致。例如:

#include 
#include
int main(void) { Bytef buf[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; uLong crcValue = crc32(0, buf, 9); printf("crc32: %d\n", crcValue); return 0;}

通过CMakeLists.txt配置,编译并运行后,输出结果与Python3一致。

为了进一步理解crc32的实现,深入分析zlib的C源码。zlib中定义了crc32_z函数,利用预先生成的crc_table数组进行计算。函数逻辑如下:

unsigned long Z_EXPORT crc32_z(crc, buf, len) {    unsigned long crc;    const unsigned char *buf;    size_t len;    if (buf == Z_NULL) return 0UL;    crc = crc ^ 0xffffffffUL;    while (len >= 8) {        DO8;        len -= 8;    }    if (len) do {        DO1;    } while (--len);    return crc ^ 0xffffffffUL;}

通过理解这一函数逻辑,可以编写自定义的C代码实现相同的crc32计算功能。例如:

#include 
#include
static const unsigned long crc_table[256] = { 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, // ...其他数据};unsigned long crc32(unsigned long crc, unsigned char *buf, size_t len) { unsigned long c; c = crc ^ 0xffffffffUL; while (len >= 8) { DO8; len -= 8; } if (len) do { DO1; } while (--len); return c ^ 0xffffffffUL;}int main(void) { unsigned char buf[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; unsigned long crcValue = crc32(0, buf, 9); printf("crc32: %d\n", crcValue); return 0;}

通过以上步骤,可以在C代码中实现与zlib一致的crc32计算,确保结果与Python3的zlib.crc32()函数一致。

转载地址:http://gdav.baihongyu.com/

你可能感兴趣的文章
Python单元测试框架介绍(超详细~)
查看>>
Python单元测试框架
查看>>
python单元测试之unittest
查看>>
Python单元测试unittest实战
查看>>
Python单元测试-模拟VS补丁
查看>>
python协程实时输出_Python 协程以及事件循环的问题,怎么知道 IO 读取结束了呢?...
查看>>
Python十进制&;包提供错误的结果
查看>>
Python化身“安全老中医”:一键搞定工控系统漏洞,从零基础到精通,收藏这篇就够了!
查看>>
Python加速运行技巧
查看>>
python办公自动化基础遍历文件夹
查看>>
python办公自动化基础输出文件和文件夹
查看>>
python办公自动化基础搜索文件
查看>>
python知识:@classmethod和@staticmethod的异同
查看>>
python前端之css
查看>>
Python制作进度条,原来有这么多方法
查看>>
Python制作简单的学生成绩管理系统
查看>>
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>