为个小善——发布 Python 库 absolute32
来源:互联网 发布:shell脚本调用java类 编辑:程序博客网 时间:2024/06/05 06:21
赖勇浩(http://laiyonghao.com)
所以我就编写了自己版本的 add、hash、crc 和 adler 函数,确保它们的返回值为带符号的 32 位整型(即值范围 [-2**31, 2**31-1])。经过在 ubuntu 10.04 LTS 32-bit/64-bit + python 2.6/3.1 测试后,我们把它用在了我们的网络协议处理中。
后来,我把它打成了一个 lib,起名为 absolute32,扔到 google code 托管起来(http://code.google.com/p/absolute32/),同时在 pypi 注册一下,方便有需要的朋友使用它,算是为个小善。
问题1
在较新版本的 Python 中,当两个 int 相加溢出时,它会自动把把结果转换到 long 类型,比如:>>> 0x7FFFFFFF + 12147483648L这个特性很好,但是它跟 C 语言的结果不一样。如果你要把结果 pack 到 4 个字节的 buffer 中发送到别的进程,结果就比较纠结:
>>> import struct>>> struct.pack("i", 0x7FFFFFFF + 1)Traceback (most recent call last): File "<stdin>", line 1, in <module>struct.error: long too large to convert to int我在设计我的 webgame 网络协议时遇到了这个问题。
问题2
在不同的硬件平台,同一个函数的返回值也可能是不一样的,比如 hash(),在 32-bit 和 64-bit 都是返回 int,但大小却大有不同:>>> hash('copyright' * 10) # 32-bit platform-942199392>>> hash('copyright' * 10) # 64-bit platform-6555514777893392992想像一下你在 32-bit 下写了一个 k/v 存储的文件放到 64-bit 去读,或者反过来,是不是让你很抓狂?
问题3
在不同的 python 版本里,不少函数的返回值也是不一样的,举个例子,zlib 里的 crc32 函数,嗯,是的,别以为它以 32 结尾就一致了!以下引用自 python manuals: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.看到了吧,zlib.crc32(及 zlib.adler32) 虽然跟 32/64 位平台无关,但是 3.x 和 2.x 版本的返回值范围是不一致的,想象一下你设计的网络协议采用了 crc/adler 算法来计算 checksum,然后用于 3.x 和 2.x 版本的 Python 程序通信,会不会想抓狂呢?
Changed in version 3.0: The return value is unsigned and in the range [0, 2**32-1] regardless of platform.
解决方案
解决方案显然是一致化,编写这些操蛋的函数的替代品,确保它们在不同的硬件、不同的版本下有同样的返回值。所以我就编写了自己版本的 add、hash、crc 和 adler 函数,确保它们的返回值为带符号的 32 位整型(即值范围 [-2**31, 2**31-1])。经过在 ubuntu 10.04 LTS 32-bit/64-bit + python 2.6/3.1 测试后,我们把它用在了我们的网络协议处理中。
后来,我把它打成了一个 lib,起名为 absolute32,扔到 google code 托管起来(http://code.google.com/p/absolute32/),同时在 pypi 注册一下,方便有需要的朋友使用它,算是为个小善。
absolute32 安装、使用
安装很简单,因为它已经上传到 pypi,所以简单地执行:easy_install -U absolute32就安装好啦,最后送上示例,享用吧,亲!
import absolute32 as aassert a.add(0x7FFFFFFF, 2) == -0x7FFFFFFFassert a.hash('copyright') == -174803930assert a.adler(b'copyright') == 322503642assert a.crc(b'copyright') == 947983859
- 为个小善——发布 Python 库 absolute32
- Python入门记——将模块转换为发布
- Python:程序发布方式简介一(打包为可执行文件EXE)
- 手工将python程序发布为exe执行程序
- 手工将python程序发布为exe执行程序
- python小练习八——多线程的发布工具
- 发布自己的python轮子——上传PyPI
- python连接redis库发布消息
- 发布IOS应用全攻略(三)——如何为iTunes Connect准备应用
- Chrome插件——一键保存网页为PDF1.0发布
- Chrome插件——一键保存网页为PDF1.0发布
- Chrome插件——一键保存网页为PDF1.1发布
- 将搜狗细胞词库转换为其他输入法词库——深蓝词库转换1.1发布
- eclipse发布web项目,汉字为问号显示——问题解决
- 牛腩新闻发布系统——“LC.exe已退出,代码为-1错误”
- 手动实现把python项目发布为exe可执行程序过程分享
- 程序发布为应用程序
- 为Python安装MySQLdb库
- Android系统开发常用的命令
- C++ Primer Plus学习:第九章 内存模型和名称空间(2)
- 【转贴】计算机核心期刊排名
- Ajax无刷新添加评论(JQuery版)
- Effective c++学习笔记——条款6,不想自动生成函数,要明确拒绝
- 为个小善——发布 Python 库 absolute32
- DOS 常用命令
- 利用Ajax实现动态级联
- double型数据的整数次方
- Java的反射(reflect)机制的学习
- Android图像处理之Bitmap类
- How to add / install JSON support to PHP on CentOS in 10 Steps
- MongoDb学习笔记三 MongoDB and PyMongo
- QT QML 信号 处理 1