将2.5字节比较转换为3字节
我正在尝试把一个2.5版本的程序转换成3版本。
在Python 3中,有没有办法把一个字节字符串,比如b'\x01\x02',转换成像Python 2.5那样的字符串,比如'\x01\x02',这样在比较字符串和逐字节比较时能和2.5的效果一样?我是在从一个二进制文件中读取这个字符串。
我有一个2.5版本的程序,它从文件中读取字节,然后将每个字节或字节组合与指定的常量进行比较或处理。为了在3版本下运行这个程序,我希望避免把所有的常量都改成字节和字节字符串(比如把'\x01'改成b'\x01'),然后还要处理3版本中的一些问题,比如:
a = b'\x01'
b = b'\x02'
结果是
(a+b)[0] != a
尽管在2.5中类似的操作可以正常工作。我必须做(a+b)[0] == ord(a),而a+b == b'\x01\x02'则没问题。(顺便问一下,我该怎么处理(a+b)[0]才能让它等于a呢?)
解包结构也是一个问题。
我是不是漏掉了什么简单的东西?
1 个回答
3
字节(Bytes)是一种不可变的整数序列,整数的范围是从0到255。所以当你访问 (a+b)[0]
时,你得到的是一个整数,这个整数和你直接访问 a[0]
时得到的是一样的。因此,当你把序列 a
和整数 (a+b)[0]
进行比较时,它们自然是不同的。
不过,你可以使用切片(slice)语法来获取一个序列:
>>> (a+b)[:1] == a # 1 == len(a) ;)
True
因为切片会返回字节对象。
我还建议你使用2to3工具(需要在py2k环境下运行)来自动转换一些代码。虽然它不能解决你所有的问题,但会帮助你很多。