• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

C++中zlib的crc32和python zlib.crc32结果不一致的解决方案

c++ 海叔叔 1天前 5次浏览 已收录 0个评论

背景

python和c++的代码中均有使用crc32分流的操作,需要保证分流得到的结果一致,那么两个crc32的方法得到的结果需要一致才行。然而实际测试中发现python2中zlib.crc32和c++的zlib中crc32得到的结果却不一致。

问题复现

python版crc32

结果为 -102031187。

C++ 版zlib crc32

运行结果为:4192936109
python版得出的结果是-102031187,而C++版本得出的结果是4192936109。

资料查找

首先从百度上查看有没有人和我遇到同样的问题,结果发现有。但是回答的结果乱七八糟,没什么参考价值。
于是找了找python的文档,发现在python2中,crc32返回的是一个有符号的值,
Changed in version 2.6: The return value is in the range [-2**31, 2**31-1] regardless of platform. In older versions the value is signed on some platforms and unsigned on others.
Changed in version 3.0: The return value is unsigned and in the range [0, 2**32-1] regardless of platform.

解决方案

根据提示,可以发现对python中crc32得到的结果和0xffffffff按位相与就可以了。

可以发现,结果和c++版本对上了。其他
python版本的crc32还有一个value参数,对应c++版本的的第一个参数

也就是说,如果改变value,计算出来的结果是不一样的。比如把value改为1,那么结果如下:

这个时候就要求其他语言的版本的crc32有同样的初始值才能保证计算结果一致。
另外,使用zlib需要链接zlib动态链接库


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址