如何在Python中以与py2和py3一起使用的方式定义二进制字符串?

时间:2011-10-13 13:45:50

标签: python python-3.x python-2.5

我正在编写一个应该在Python 2和3中工作的模块,我需要定义一个二进制字符串。

通常这会像data = b'abc',但是这段代码在Python 2.5上失败,语法无效。

如何以适用于所有版本的Python 2.5 +

的方式编写上述代码

注意:这必须是binary(它可以包含任何类型的字符,0xFF),这非常重要。

3 个答案:

答案 0 :(得分:5)

我会推荐以下内容:

from six import b

当然,这需要six module。 如果你不想要,那么这是另一个版本:

import sys
if sys.version < '3':
    def b(x):
        return x
else:
    import codecs
    def b(x):
        return codecs.latin_1_encode(x)[0]

More info

这些解决方案(基本上是相同的)工作,干净,速度快,并且可以支持所有256字节值(这里没有其他解决方案)。

答案 1 :(得分:1)

如果字符串只有ASCII字符,请调用encode。这将为您提供Python 2中的str(就像b'abc')和Python 3中的bytes

'abc'.encode('ascii')

如果没有,不是将二进制数据放入源代码中,而是创建一个数据文件,用'rb'打开它并从中读取。

答案 2 :(得分:-3)

您可以存储base64编码的数据。

第一步是转换为base64:

>>> import base64
>>> base64.b64encode(b"\x80\xFF")
b'gP8='

这要做一次,使用b与否取决于您使用的Python版本。

在第二步中,将此字节字符串放入没有b的程序中。 然后确保它在py2和py3中工作。

import base64
x = 'gP8='
base64.b64decode(x.encode("latin1"))

在2.6中为您提供str '\x80\xff'(在2.5中也应该有效),在3.x中为b'\x80\xff'

除了上述两个步骤之外,你可以对十六进制数据做同样的事情,你可以这样做

import binascii
x = '80FF'
binascii.unhexlify(x) # `bytes()` in 3.x, `str()` in 2.x