如何将字节数组显示为十六进制值

问题描述 投票:0回答:5
>>> struct.pack('2I',12, 30)
b'\x0c\x00\x00\x00\x1e\x00\x00\x00'    
>>> struct.pack('2I',12, 31)
b'\x0c\x00\x00\x00\x1f\x00\x00\x00'
>>> struct.pack('2I',12, 32)
b'\x0c\x00\x00\x00 \x00\x00\x00'
                  ^in question
>>> struct.pack('2I',12, 33)
b'\x0c\x00\x00\x00!\x00\x00\x00'
                  ^in question

我希望所有值都显示为十六进制

python
5个回答
18
投票

参见

bytes.hex()

>>> import struct
>>> struct.pack('2I', 12, 30).hex()  # available since Python 3.5
'0c0000001e000000'
>>> struct.pack('2I', 12, 30).hex(' ')  # separator available since Python 3.8
'0c 00 00 00 1e 00 00 00'
>>> struct.pack('2I', 12, 30).hex(' ', 4)  # bytes_per_sep also since Python 3.8
'0c000000 1e000000'

旧版 Python 使用

binascii.hexlify
:

>>> import binascii
>>> import struct
>>> binascii.hexlify(struct.pack('2I', 12, 30))
b'0c0000001e000000'

或者如果您想要空格使其更具可读性:

>>> ' '.join(format(n,'02X') for n in struct.pack('2I', 12, 33))
'0C 00 00 00 21 00 00 00'

Python 3.6+,使用 f 字符串(但

.hex()
可用且更简单)。

>>> ' '.join(f'{n:02X}' for n in struct.pack('2I', 12, 33))
'0C 00 00 00 21 00 00 00'

11
投票

他的呢?

>>> data = struct.pack('2I',12, 30)
>>> [hex(ord(c)) for c in data]
['0xc', '0x0', '0x0', '0x0', '0x1e', '0x0', '0x0', '0x0']

表达式

[item for item in sequence]
是所谓的 列表理解 。它基本上是一种非常紧凑的编写简单
for
循环并从结果创建列表的方法。

ord()
内置函数接受一个字符串,并将其转换为一个整数,该整数是其对应的unicode代码点(对于ASCII字符集中的字符与它们在ASCII表中的值相同)。

其对应项,

chr()
(对于 8 位字符串)或
unichr()
(对于 unicode 对象)则执行相反的操作。

内置的

hex()
只需将整数转换为其十六进制表示形式即可。


正如 @TimPeters 所指出的,在 Python 3 中,你需要丢失

ord()
,因为迭代 bytes 对象将(已经)产生整数:

Python 3.4.0a3 (default, Nov  8 2013, 18:33:56)
>>> import struct
>>> data = struct.pack('2I',12, 30)
>>> type(data)
<class 'bytes'>
>>> type(data[1])
<class 'int'>
>>>
>>> [hex(i) for i in data]
['0xc', '0x0', '0x0', '0x0', '0x1e', '0x0', '0x0', '0x0']

7
投票

如果你想

\x
到处转义,你必须自己重新格式化;例如,

>>> import struct
>>> r = struct.pack('2I',12, 33)
>>> r
b'\x0c\x00\x00\x00!\x00\x00\x00'
>>> list(r)
[12, 0, 0, 0, 33, 0, 0, 0]
>>> print("".join("\\x%02x" % i for i in r))
\x0c\x00\x00\x00\x21\x00\x00\x00

2
投票

在 Python 3.7 中,

bytes
对象没有
encode()
方法;以下代码不再起作用。

import struct

hex_str = struct.pack('2I',12, 30).encode('hex')

Python 3.7 代码应使用 Python 3.5 中引入的

encode()
 方法,而不是 
hex()

import struct

# hex_str will contain the '0c0000001e000000' string.
hex_str = struct.pack('2I',12, 30).hex()

0
投票

有一个选项可以使用

encode
将字节数组转换为十六进制字符串。它适用于 Python 2.4 中的任何 Python:

Python 2.7.12 (default, Oct 10 2016, 12:50:22)
>>> import struct
>>> struct.pack('2I',12, 30).encode('hex')
'0c0000001e000000'
>>> struct.pack('2I',12, 31).encode('hex')
'0c0000001f000000'
>>> struct.pack('2I',12, 32).encode('hex')
'0c00000020000000'
>>> struct.pack('2I',12, 33).encode('hex')
'0c00000021000000'
© www.soinside.com 2019 - 2024. All rights reserved.