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

9 投票
3 回答
37879 浏览
提问于 2025-04-16 22:31

我刚接触Python,遇到了一个问题:我需要把一个整数转换成一个6字节的十六进制字符串。

比如说,281473900746245 转换后应该是 "\xFF\xFF\xBF\xDE\x16\x05"。

这个十六进制字符串的格式很重要,整数的长度是变化的。

我试过的格式 '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 个回答

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

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

>>> i = 281473900746245       
>>> i.to_bytes((i.bit_length() + 7) // 8, "big")
b'\xff\xff\xbf\xde\x16\x05'
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的评论,由于你可能在处理较长的值,你可能需要稍微调整一下十六进制的输出:

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

撰写回答