Python3字节到十六进制字符串

Posted

技术标签:

【中文标题】Python3字节到十六进制字符串【英文标题】:Python3 bytes to hex string 【发布时间】:2015-01-17 08:38:16 【问题描述】:

我有一个字节对象:

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'

有没有没有办法这样做?

【问题讨论】:

【参考方案1】:

您只是想在这里从 ASCII 解码,您的字节串 已经 代表十六进制数字,用 ASCII 字符表示:

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

您尝试的一切都是将字节解释为数字数据,或者将其解释为表示字节的十六进制数字或表示数字数据的字节。

因此,您的第一次尝试将值 06 作为十六进制数并将其转换为字节值 6,然后将 7b 转换为字节值 123,这是 的 ASCII 代码点字符。

在您的第二次尝试中,您将每个字节转换为其数值的十六进制表示。 0 字节被解释为整数 48('0' 字符的 ASCII 代码点),即十六进制的 30'6' 是 54,或者 36 是十六进制等。

【讨论】:

这行得通,但我看不出b'067b' 是怎样的ASCII。真的不是两个字节,'06'和'7b'吗?如果将其作为 ASCII 值,那确实会给我 '\x06' 。这里到底发生了什么? @MightyPork:不,它是 4 个字节。字符067bb'...' 文字符号不采用十六进制字符,它采用 ASCII 字符。 @MightyPork:见literal notation specification;如果您打算指定两个字节,您可以使用b'\x06\x7b'(例如使用\xhh 十六进制转义),或使用bytes() 函数并传入整数序列:bytes([0x06, 0x7b]),使用指定为十六进制文字的整数。 我从pyudev 得到这个并想展示它。我不是在建造它。这只是我第一次看到 b'blah' 符号.. 对。另请参阅What does a b prefix before a python string mean?。 :-)【参考方案2】:

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") (这样你就可以从这些字节构造一个 str 来解释它们,就像 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'>

【讨论】:

以上是关于Python3字节到十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python3 - 读写字节数据

在Python 3中将十六进制字符串(python 2)转换为带有十六进制数字的字节

Python3 字符编码

字节数组到十六进制字符串

在 Python 3 中将二进制字符串转换为字节数组

python中的十六进制字符串到字节数组