将2.5字节比较转换为3字节

2 投票
1 回答
612 浏览
提问于 2025-04-15 14:26

我正在尝试把一个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环境下运行)来自动转换一些代码。虽然它不能解决你所有的问题,但会帮助你很多。

撰写回答