将整数转换为特定格式的十六进制字符串
我刚接触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')