我是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
感谢您的帮助!
答案 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'