用python实现crc32求字符串校验码
转帖:
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
Python 2.5.2 (r252:60911, Mar 27 2008, 17:57:18) [MSC v.1310 32 bit (Intel)] on win32)里面的按位取反尽然不是按位取反,网上搜出好多文章都说~在python中是按位取反,自己测试了下:
>>> ~3,~2,~1,~0,~-1,~-2,~3
(-4, -3, -2, -1, 0, 1, -4)
才恍然大悟,原来是这里出错了。
再看:
>>> import binascii
>>> binascii.crc32("我们")
-603163415
如果把下面代码的倒数第二行
dwCrc32 = dwCrc32 ^ 0xFFFFFFFFL
改成
dwCrc32 = ~dwCrc32
然后运行:mycrc32("我们") 得到结果也是-603163415
所以怀疑python2.5里面是不是也中了这个陷阱了。
用下面的代码得到的就和c代码计算得到的crc32校验码一致了。不过python支持的正数要比c的大,所以按位求反这里只能保证32位情况下得到和c代码一样的校验码。
#coding=gbk
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
&nb
相关文档:
过量的参数
在运行时知道一个函数有什么参数,通常是不可能的。另一个情况是一个函数能操作很多对象。更有甚者,调用自身的函数变成一种api提供给可用的应用。
对于这些情况,python提供了两种特别的方法来定义函数的参数,允许函数接受过量的参数,不用显式声明参数。这些“额外”的参数下一步再解释。
注意a ......
还记得是一个月的事情,神奇般的在youtube上搜索python,有个老外的教程里面有这么个内容:
#=============================
## python 魔法传值
#=============================
#-*-coding:utf-8-*-
class sono:
def Dict(self,**args):
ret ......
关键字: python com 报告
http://appofis.javaeye.com/blog/417446
python 操作ms office 生成报告相关总结
I. 项目中需要生成word和excel报告,通常有两种方法:基于字符串拼接以及COM调用。
1) 字符串拼接生成office文档的原理: office文档本身可以体现为xml文件格式,尤其是MS Excel
2003,我们可以自己将一 ......
def getText(self,nodelist):
rc=""
for node in nodelist:
if node.nodeType == node.TEXT_NODE or node.nodeType == node.CDATA_SECTION_NODE:
rc = rc + node.data
return rc
def parseXML(self,requesturl,xml):
dom = minidom.parse(requesturl)
for node in dom.getElementsByTagName('ca ......
#将一些类型的文件压缩为7z.py
#for folder all file do 7z
import os
import sys
import distutils.file_util
def ImportOkFile():
if(os.path.isfile("D:\\Records\\将一些类型的文件压缩为7z_record.txt")==False):
f=open("D:\\Reco ......