将decimal int转换为little endian字符串('\ x ## \ x ## ...')

时间:2012-10-30 15:01:06

标签: python

我想将一个整数值转换为十六进制值的字符串,用little endian。例如,5707435436569584000将变为'\x4a\xe2\x34\x4f\x4a\xe2\x34\x4f'

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

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

2 个答案:

答案 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字符来表示结果字节字符串,因此上述结果的14OJ24OJ部分:

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