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

新手上路,请多包涵
>>> 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

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

原文由 Siavash 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 444
2 个回答

他的呢?

 >>> 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] 是所谓的 list comprehension 。它基本上是一种编写简单 for 循环并根据结果创建列表的非常紧凑的方法。

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

它的对应物 chr() 对于 8 位字符串或 unichr() 对于 unicode 对象做相反的事情。

hex() 内置函数然后简单地将整数转换为它们的十六进制表示。


正如@TimPeters 所指出的,在 Python 3 中,您需要丢失 ord() ,因为遍历字节对象将(已经)产生整数:

 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']

原文由 Lukas Graf 发布,翻译遵循 CC BY-SA 3.0 许可协议

请参见 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'

原文由 Mark Tolonen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题