【问题标题】:Converting 2.5 byte comparisons to 3将 2.5 字节比较转换为 3
【发布时间】:2009-09-20 08:12:48
【问题描述】:

我正在尝试将 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 怎么办?)

拆包结构也是一个问题。

我错过了一些简单的东西吗?

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    字节是一个不可变的整数序列(在 0(a+b)[0] 时,您将得到一个整数,与访问 @ 得到的整数完全相同987654322@。因此,当您将序列 a 与整数 (a+b)[0] 进行比较时,它们自然是不同的。

    使用切片表示法,您可以返回一个序列:

    >>> (a+b)[:1] == a         # 1 == len(a) ;)
    True
    

    因为切片返回字节对象。

    我还建议运行 2to3 实用程序(它需要与 py2k 一起运行)来自动转换一些代码。它不会解决你所有的问题,但会很有帮助。

    【讨论】:

    • >>所以当您将序列 a 与整数 (a+b)[0] 进行比较时,它们自然是不同的。>> 除了 2.5 中的类似项目并非如此。我意识到为什么这在 py3k 的上下文中是有意义的,但是它使转换变得乏味
    • 2to3(在 py3k 下运行)有助于在打印语句中添加括号。它对字节与字符串的问题没有任何作用,如果能找到一个通用的解决方案就好了。
    猜你喜欢
    • 2019-03-15
    • 2022-12-06
    • 1970-01-01
    • 2014-10-21
    • 2019-02-19
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多