4

我想将整数值转换为十六进制值的字符串,采用小端序。例如,5707435436569584000将成为'\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'.

我的 googlefu 为我找到的所有东西hex(..)都给了我'0x4f34e24a4f34e180'这不是我想要的。

我可能可以手动拆分该字符串并构建我想要的字符串,但我希望有人可以为我指出一个更好的选择。

4

2 回答 2

16

您需要使用该struct模块

>>> import struct
>>> struct.pack('<Q', 5707435436569584000)
'\x80\xe14OJ\xe24O'
>>> struct.pack('<Q', 5707435436569584202)
'J\xe24OJ\xe24O'

这里<表示little-endian,Q表示我们要打包一个unsigned long long(8字节)。

请注意,Python 将对落在可打印 ASCII 范围内的任何字节使用 ASCII 字符来表示生成的字节串,因此上述结果的14OJ,24OJ部分:

>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
于 2012-10-30T15:03:22.880 回答
0

我知道这是一个旧线程,但它仍然有用。这是我使用python3的两分钱:

hex_string = hex(5707435436569584202) # '0x4f34e24a4f34e180' as you said
bytearray.fromhex(hex_string[2:]).reverse()

因此,关键是将其转换为字节数组并将其反转。在一行中:

bytearray.fromhex(hex(5707435436569584202)[2:])[::-1] # bytearray(b'J\xe24OJ\xe24O')

PS:您可以将“bytearray”数据视为“bytes”,甚至将它们与b'raw bytes'

更新: 正如Will在评论中指出的那样,您还可以管理负整数:

要使用负整数进行此操作,您需要使用首选的 int 类型输出长度来屏蔽输入。例如,-16 作为小端 uint32_t 将是 bytearray.fromhex(hex(-16 & (2**32-1))[2:])[::-1],其计算结果为 bytearray(b'\ xf0\xff\xff\xff')

于 2018-12-02T01:58:53.080 回答