我想将整数值转换为十六进制值的字符串,采用小端序。例如,5707435436569584000
将成为'\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
.
我的 googlefu 为我找到的所有东西hex(..)
都给了我'0x4f34e24a4f34e180'
这不是我想要的。
我可能可以手动拆分该字符串并构建我想要的字符串,但我希望有人可以为我指出一个更好的选择。
我想将整数值转换为十六进制值的字符串,采用小端序。例如,5707435436569584000
将成为'\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
.
我的 googlefu 为我找到的所有东西hex(..)
都给了我'0x4f34e24a4f34e180'
这不是我想要的。
我可能可以手动拆分该字符串并构建我想要的字符串,但我希望有人可以为我指出一个更好的选择。
您需要使用该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
,24O
和J
部分:
>>> struct.pack('<Q', 5707435436569584202).encode('hex')
'4ae2344f4ae2344f'
>>> '\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
'J\xe24OJ\xe24O'
我知道这是一个旧线程,但它仍然有用。这是我使用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')