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 个字节。字符0
、6
、7
和b
。 b'...'
文字符号不采用十六进制字符,它采用 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字节到十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章