用python实现crc32求字符串校验码
来源:互联网 发布:机器人算法 编辑:程序博客网 时间:2024/05/16 06:07
转帖: http://blog.csdn.net/wyingquan/archive/2008/12/20/3561094.aspx 用python自带的binascii模块计算字符串的校验码,出来的是负值,与用c写的程序得出的校验码不一样,所以就研究了一下。发现别人用的python3.0版本binascii模块计算出的crc32校验码是我想要的,没办法只好自己用python实现一下crc32的算法了。发现算法很简单,就是某些实现里面弄了好几个函数倒搞复杂了,其实按核心算法算法走一边很容易就理解和应用了。 因为直接从c程序转过来的,结果发现python2.5(我用的版本ActivePython 2.5.2.2 (ActiveState Software Inc.) based on >>> ~3,~2,~1,~0,~-1,~-2,~3 才恍然大悟,原来是这里出错了。 再看: >>> import binascii 如果把下面代码的倒数第二行 dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL 改成 dwCrc32 = ~dwCrc32 然后运行:mycrc32("我们") 得到结果也是-603163415 所以怀疑python2.5里面是不是也中了这个陷阱了。 用下面的代码得到的就和c代码计算得到的crc32校验码一致了。不过python支持的正数要比c的大,所以按位求反这里只能保证32位情况下得到和c代码一样的校验码。 #coding=gbk
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on win32)里面的按位取反尽然不是按位取反,网上搜出好多文章都说~在python中是按位取反,自己测试了下:
(-4, -3, -2, -1, 0, 1, -4)
>>> binascii.crc32("我们")
-603163415
def mycrc32(szString):
m_pdwCrc32Table = [0 for x in range(0,256)]
dwPolynomial = 0xEDB88320;
dwCrc = 0
for i in range(0,255):
dwCrc = i
for j in [8,7,6,5,4,3,2,1]:
if dwCrc & 1:
dwCrc = (dwCrc >> 1) ^ dwPolynomial
else:
dwCrc >>= 1
m_pdwCrc32Table[i] = dwCrc
dwCrc32 = 0xFFFFFFFFL
for i in szString:
b = ord(i)
dwCrc32 = ((dwCrc32) >> 8) ^ m_pdwCrc32Table[(b) ^ ((dwCrc32) & 0x000000FF)]
dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL
return dwCrc32
- 用python实现crc32求字符串校验码
- 用python实现crc32求字符串校验码
- python 求crc32的值
- 以太网帧FCS校验码CRC32的三种实现方法
- 以太网帧FCS校验码CRC32的三种实现方法
- lua CRC32校验码生成
- LoadRunner实现:计算字符串Crc32
- [CTF]python求crc32值的方法
- CRC32位校验码的源代码
- 【原】以太网帧FCS校验码CRC32的三种实现方法
- CRC32算法实现:python与C
- 用Python计算身份证校验码
- 用Python计算身份证校验码
- CRC32位校验码的源代码(VB.NET)
- JAVA计算文件的crc32校验码
- java 生成文件的 CRC32校验码
- 用python计算md5,sha1,crc32
- 用python计算md5,sha1,crc32
- MyEclipse6.5使用设置技巧及快捷键
- 配置主机间信任的一个简单办法。
- linux D-Bus tutorial
- NOKIA-S60第三版目录路径与分析(完整版)
- LINUX下的iptables
- 用python实现crc32求字符串校验码
- 初级日语语法副词的四个类别
- 如何将WORD文档转成CHM帮助
- CSS经典技巧十则
- Post(book) multi sales order per X++
- 日语前后呼应惯用型
- 测试一下
- 日语等级考试中常出现的副词小结
- Symbian S60系列---PKG文件范例详解