Python3字节转十六进制字符串

10

我有一个 bytes 对象:

a =  b'067b'

我该如何从中获取一个字符串呢?就像这样:

"067b"

我尝试过:

In [3]: str(a)
Out[3]: "b'067b'"

In [4]: import codecs

In [5]: codecs.decode(a,'hex')
Out[5]: b'\x06{'

In [6]: import binascii

In [7]: binascii.b2a_hex(a)
Out[7]: b'30363762'

In [8]: binascii.hexlify(a)
Out[8]: b'30363762'

有没有任何方法可以做到这一点?

2个回答

9

bytes 表示可能会让人感到困惑。b'0607'bytes([0x06,0x07]) 不同。实际上,b'0607' 是由 4 个字节组成的 [48,54,48,55],其中 48 是 0 的 ASCII 码,以此类推。

[x for x in b'0607'] 
[48, 54, 48, 55]

因此,b'0607' 已经是一个 ASCII 字符串,但表示为 bytes。如果您想将其转换为 str,您需要执行 b'0607'.decode("ascii") (这样您就可以从这些字节中构造一个字符串并像 ASCII 代码一样解释它们(因为它们就是))。

通常,您可以按如下方式将 bytes 转换为十六进制字符串:

>>> a = binascii.hexlify(bytes([1,10,15,16,255]))
>>> a
b'010a0f10ff'
>>> type(a)
<class 'bytes'>
>>> b = a.decode("ascii")
>>> type(b)
<class 'str'>

9

您只需要从ASCII解码,因为您的字节串已经用ASCII字符表示了十六进制数:

>>> a = b'067b'
>>> a.decode('ascii')
'067b'

你所尝试的一切都是将字节解释为数字数据,无论是将其视为表示字节的十六进制数,还是将其视为表示数字数据的字节。
因此,你的第一次尝试将值06作为十六进制数,并将其转换为字节值6,7b则被转换为字节值123,这是字符{的ASCII代码点。
在第二个尝试中,你将每个字节转换为其数值的十六进制表示。0字节被解释为整数48(字符'0'的ASCII代码点),即16进制的30。'6'是54,或16进制的36等。

这个可以工作,但我不明白 b'067b' 怎么是 ASCII 码。它难道不是两个字节,'06' 和 '7b' 吗?如果按照 ASCII 值来看,那应该是 '\x06{'。这里到底发生了什么? - MightyPork
@MightyPork:不,它是四个字节。字符067bb'...'的文字表示法不使用十六进制字符,而是使用ASCII字符。 - Martijn Pieters
@MightyPork:请查看文字表示规范;如果您想指定两个字节,可以使用b'\x06\x7b'(例如使用\xhh十六进制转义),或者使用bytes()函数并传入整数序列:bytes([0x06, 0x7b]),使用十六进制文字指定的整数。 - Martijn Pieters
我从 pyudev 中获取了这个并想要显示它。我没有构建它。这是我第一次看到 b'blah' 表示法。 - MightyPork
好的。之后请看Python字符串前带有b前缀是什么意思?。:-) - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接