Python更新问题(2.3到2.4):x<

大家好! 我一直在将一些Python自定义C扩展代码转换为Python, 因为我需要这些模块可以便携 需要编译(出于目的,必须2.4,因为它是最后一个 Pythonce释放,有了很大的改进). 但是我一直陷入脚本的困扰,这曾经是预期的 翻译成Python,2.4 同时,我认为我可以用旧的2.3版I进行测试 也安装在我的计算机上,发现它按预期运行,但请参阅 未来的战役,有点谷歌搜索,发现了PEP 237和长整数 集成问题,但找不到任何解决方法来修复代码 对于Python 2.4 希望有人可以指出一些建议,或者解决方案是 很简单,但是我错过了. 正如我所说,该代码在2.3上正常工作. 我附上下面的代码. 麻烦是在cattcrc16功能上,如您在 未来的消息. initcrc16函数也可以做一些位XOR,但是我检查了一下 按预期工作. 思考是因为只有很小的价值观 那里. 预先感谢您的任何帮助, 冈萨洛 ################################ Python 2.3.2: pytest1.py:90:未来沃宁:x << y失去位或更改标志将会 在Python 2.4及以上返回长时间 crc = gcrc16table [(((crc >> 8)&255)] ^(crc << 8) ^ ord(str [x]) 67560050 ################################ Python 2.4.2: 22002496167782427386022243744416249380505050506826666541682 *预期结果为67560050* ################################## #pytest1.py gcrc16table = [] def Initcrc16(): 全球GCRC16T 对于我在Xrange(0,256)中: crc = i << 8 对于Xrange(0,8)中的J: 如果(CRC&0x8000)!= 0: TMP = 0x1021 别的: TMP = 0 CRC =(CRC << 1) ^ TMP gcrc16table.append(CRC) DEF CATCRC16(STR): 全球GCRC16T CRC = 0xffff 对于xrange(0,len(str))中的x: crc = gcrc16table [(((crc >> 8)&255)] ^(crc << 8) ^ ord(str [x]) 返回CRC test =" 123456ASDFG12345123" initcrc16() 打印cattcrc16(test)

# 回答1

作为一个开始, 因此,您可以在最后这样做. 但是您真的不想携带所有垃圾, 每次在循环周围增加更长的时间. 让我们进一步 通过摆脱Xrange gizmoid和一个 其他一些不良的东西: #在您的1个测试值上测试 DEF CATCCRC16V2(ASTR):#不要Shadow Str() #全局gcrc16table#不需要这个 crc = 0xffffl#开始长时间 对于C Astr: crc = gcrc16table [(((crc >> 8)&255)] ^((crc&0xffffff)<< 8) ^ ord(c) 返回CRC 那应该让你前进. 虽然整个计算将完成 用渴望而不是ints,渴望永远不会超过32位 不应该太慢. hth, 约翰
# 回答2

非常感谢约翰, 我错过了将 *和 *加入到解决结果问题的重点! 我想我现在理解了. 我是在翻译一旦翻译的代码的时间,所以这是 CRC计算函数. 我确实期望有很大的差距,因为这有很多 查找CRC表的 (一个典型的通话长20-250个字符长) 因此,具有简单数组和指针执行的C扩展版本 真的好多了. C代码与pyrex粘合. 幸运的是,我在PocketPC中不需要此代码的出色表现! C CATCRC16 1个循环 - > 4.75e -006秒 210562循环 - > 0.133秒 1580403循环 - > 0.973秒 1580403循环 - > 0.973秒0.971秒1.12秒 1580403循环,最佳3个试验:0.614 USEC每循环 python coltcrc16 1个循环 - > 0.000102秒 9834循环 - > 0.832秒 11824循环 - > 1.01秒 11824循环 - > 1.01秒1.02秒1.01秒 11824循环,最佳3次试验:85.1 USEC每循环 测试:Cattcrc16('Klldjs@ajsdla#kjfdsfj32389293rhcnacak12 932842fjos') C版本: 长钙CRC16(char *str) { 长CRC; for(crc = 0xffff; *str!= 0; str ++){ crc = crc16table [(((crc >> 8)&255)] ^(crc << 8) ^ *str; } 返回CRC; } John Machinescribió:67560050L 因此,您最终可以做到这一点.但是您并不想真正携带所有垃圾,每次围绕循环越来越长. 让我们通过摆脱Xrange gizmoid和其他不良功能,进一步转化为python:#在您的1个测试vituredef cattcrc16v2(astr)上测试:#not shadow str()#global gcrc16table#not #开始时要在ASTR中进行C = crc = gcrc16table [(((crc >> 8)&255)] ^((crc&0xffffff)<< 8) ^ ord(c)返回crcthat应该让您前进. 尽管整个计算将以渴望而不是ints进行完成,但渴望永远不会超过32位,因此它不会太慢. 冈萨洛写道: """ 我错过了将 *和 *加入到长期结果的重点 问题! 我想我现在理解了. 我是在翻译一旦翻译的代码的时间,所以这是 CRC计算函数. """ 是的,我们俩都缺少" 16"表示16位的观点 宽的!! 它携带了一个额外的16个冗余位,不贡献 具有检查能力. 如果您的软件 *需要 *生成/检查完全相同的32位范围 CRC是由该C例程计算出来的,那么我给您的东西应该可以. 您还有其他测试值吗? 特别是测试一个空字符串 并说" \ x00" * 8-有时CRC规格会做点什么 特殊的短字符串,例如 将它们放入零字节. 实际上,c例程是在进一步阅读中令人难以置信的! 它 停在零字节上,而不是在给定的长度上工作. CRC是 通常期望能够处理任何数据(包括二进制数据)是否 它包含\ x00或不包含. 你在用什么? 如果您不必与其他软件进行交互,则进行16位检查 足够了,然后在此消息的末尾是一个16位版本 将仅使用INT,因此可能会更快地运行. 但是,您可能希望使用python提供的CRC32(in Binascii模块). 进一步注意:到目前为止,我们似乎还不是CCITT又名X.25 标准CRC-16, 但是反思. 请参阅http://www.joegeluso.com/software/articles/ccitt.htm 而且,如果您有时间和决心,则 罗斯·威廉姆斯(Ross Williams)指的是. 干杯, 约翰 === 16位版本=== gcrc16table = [] def Initcrc16(): 全球GCRC16T 对于我在Xrange(0,256)中: crc = i << 8 对于Xrange(0,8)中的J: 如果(CRC&0x8000)!= 0: TMP = 0x1021 别的: TMP = 0 CRC =(CRC << 1) ^ TMP CRC&= 0xffff gcrc16table.append(CRC) Def Cattcrc16(ASTR): CRC = 0xffff 对于C Astr: crc = gcrc16table [(((crc >> 8)&255)] ^((crc&0xff)<< 8) ^ ORD(C) 断言0 <= crc <= 0xffff#在执行时间时删除:-) 返回CRC test =" 123456ASDFG12345123" initcrc16() 结果= COTCRC16(测试) 打印结果,十六进制(结果) ======
# 回答3

谢谢您的所有建议! :-) c例程几乎改变了数据类型,用于单词 - 硬件制造商给出的功能,其在其中使用的代码相同 固件来计算发送或接收的每条数据的校验和 该数据有些特别:它不仅包含普通的ASCII 角色数据(仅0x01-0x09作为定义者),每个数据集结束 使用0x00 null字节,因此可以计算校验和直至" \ x00" 到达了. 而且我必须获得相同的CRC计算. 那个c例程 (也是非常相似的PHP)测试了几个月,并且工作顺利. 当然,我应该使用整数不久! 八位计算机时代... ;-)来自硬件制造商的原始代码 顺便说一句. 现在真的不知道为什么我使用了很长时间. 我 以为我这样做了,因为请参阅Pyrex C生成的胶水代码 使用pyint_fromlong,因此认为会使用相同的类型. 我更改了C函数以使用整数,并且正在执行一点 比使用long的慢一点(最好的长度:0.614us,最好与int: 0.629us),也许正如我所说的那样,pyrex胶水总是回报 带有PyObject* Pyint_fromlong的值 数据类型? 无论如何,这两个结果都很好,时间差距为 微不足道(int:1580403循环 - > 0.973秒,长:1601902循环 - > 1.01秒),因为我通常不必打电话超过100,000次 加载完整的文件数据备份. 作为此处使用的校验和算法的注释,我认为硬件 制造商几年前实施了序列数据 变速器,但后来附上了一些以太网端口,他们想 使协议兼容. 无论如何,正如我在链接中看到的那样, 似乎位于CCITT CRC-16,但它们适应自己的 需求 - 硬件单元的绩效问题? - (从不0 x00等) 问候, 冈萨洛. John Machinescribió:( _@_) 在2006年5月22日上午5:22,冈萨洛·蒙佐恩(GonzaloMonzón)写道: 我有些困惑:您是否有交叉编译C进行运行的设施 在口袋PC上? 如果没有,为什么您继续提及快速版本 在C中编码并与Pyrex粘合? 如果是,为什么您包括Python 您最初的问题中的版本? 切 ers, 约翰
# 回答4

你好,约翰! John Machinescribió: 仅为2个字节长(0x0至0xffff). 我真的不知道宽度有多大 "字",但我想它的2个字节长. 请注意,目前在大多数/许多C编译器中," int"和" long"*两位都意味着32位,要获得64位,您需要"长" [或" _int64"或在黑暗之束下的领域中的任何范围 塔],如果幸运的话,"短"会给您16位. 在典型的python环境中," int"使用c" long",因此通常将是32位.Python" long"是可变长度的数据类型.此外,即使"校验和"是32位,即使"校验和 宽,高阶16bits并不明确有用,因此您可以在接收时使用[更快] 16位. 那只是因为我有一些用于常见通信任务的模块 使用该硬件接口,我在某些PC应用程序中使用它们, 但是现在我正在编码一个在PocketPC上运行的类似应用程序,所以我使用 两种版本的CRC计算在不同的应用程序中:C/pyrex on PC与Distutils/GCC-一起使用,我正在使用Python 麻烦,仅用于PocketPC. 我仍然必须设置新的MS.EVC编译环境 Pythonce 2.4.3发布,但现在还没有时间到目前为止 赶紧完成PocketPC应用程序的第一个演示版本,所以像我一样 C/pyrex中的C依赖性很少,我没有工作 python版本类似于CRC计算.-我认为是一个更好的主意 在Python中重新编码它们. 如果您好奇,我很高兴显示 PocketPC应用程序. - 好吧,它在PC&PPC-上都可以正常运行. 这是一项运动 定时"远程点"应用程序,它连接到定时硬件,发送 通过Internet和同时获得的主要计时软件数据 其他要点数据和比赛结果,因此您可以在 比赛进行时的每个时间安排:http://serveisw3.net/temp/ppc_preview/ppc_preview.html 欢呼,约翰 问候, 冈萨洛.

标签: python

添加新评论