使用特定格式将整数转换为十六进制字符串

时间:2011-07-29 14:46:00

标签: python string int hex

我是python的新手,有以下问题:我需要将一个整数转换为一个6字节的十六进制字符串。

e.g。 281473900746245 - > “\ XFF \ XFF \ XBF \ XDE \ X16 \ X05”

十六进制字符串的格式很重要。 int值的长度是可变的。

格式'0xffffbf949309L'对我不起作用。 (我用hex(int-value))

得到这个

我的最终解决方案(在一些“播放”之后)是:

def _tohex(self, int_value):
    data_ = format(int_value, 'x')

    result = data_.rjust(12, '0')
    hexed = unhexlify(result)

    return hexed

感谢您的帮助!

3 个答案:

答案 0 :(得分:13)

可能有更好的解决方案,但您可以这样做:

x = 281473900746245
decoded_x = hex(x)[2:].decode('hex') # value: '\xff\xff\xbf\xde\x16\x05'

故障:

hex(x)                     # value: '0xffffbfde1605'
hex(x)[2:]                 # value: 'ffffbfde1605'
hex(x)[2:].decode('hex')   # value: '\xff\xff\xbf\xde\x16\x05'

<强>更新

根据@multipleinstances和@Sven的评论,因为你可能正在处理长值,你可能需要稍微调整一下hex的输出:

format(x, 'x')     # value: 'ffffbfde1605'

然而,有时候,十六进制的输出可能是奇数长度,这会破坏解码,因此创建一个函数可能会更好:

def convert(int_value):
   encoded = format(int_value, 'x')

   length = len(encoded)
   encoded = encoded.zfill(length+length%2)

   return encoded.decode('hex')

答案 1 :(得分:3)

在Python 3.2或更高版本中,您可以使用整数的to_bytes()方法。

>>> i = 281473900746245       
>>> i.to_bytes((i.bit_length() + 7) // 8, "big")
b'\xff\xff\xbf\xde\x16\x05'

答案 2 :(得分:1)

如果您不使用Python 3.2(我很确定您没有),请考虑下一个方法:

>>> i = 281473900746245
>>> hex_repr = []
>>> while i:
...     hex_repr.append(struct.pack('B', i & 255))
...     i >>= 8
...
>>> ''.join(reversed(hex_repr))
'\xff\xff\xbf\xde\x16\x05'