我想将一个整数值转换为十六进制值的字符串,用little endian。例如,5707435436569584000
将变为'\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'
。
我所有的googlefu找到的都是hex(..)
,它给了我'0x4f34e24a4f34e180'
这不是我想要的。
我可能会手动拆分该字符串并构建我想要的字符串,但我希望somone可以指出一个更好的选择。
答案 0 :(得分:10)
您需要使用struct
module:
>>> import struct
>>> struct.pack('<Q', 5707435436569584000)
'\x80\xe14OJ\xe24O'
>>> struct.pack('<Q', 5707435436569584202)
'J\xe24OJ\xe24O'
此处<
表示little-endian,Q
表示我们要打包一个无符号长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'
答案 1 :(得分: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:您可以将“字节数组”数据视为“字节”,甚至可以将它们与b'raw bytes'
混合
更新: 正如Will指出的那样,您还可以管理负整数:
要使它与负整数一起使用,您需要使用首选的int类型输出长度来屏蔽输入。例如,作为小尾数uint32_t的-16将是bytearray.fromhex(hex(-16&(2 ** 32-1))[2:])[::-1],其结果为bytearray(b'\ xf0 \ xff \ xff \ xff')