这是将Python编号转换为十六进制字符串的最佳方法吗?
number = 123456789
hex(number)[2:-1].decode('hex')
当您执行1234567890时,有时它不起作用并抱怨奇数字符串。
澄清:
我要从int到hex。
另外,我需要将其转义。
IE: 1234567890 - > '\ x49 \ x96 \ x02 \ xd2'不是'499602D2'
此外,它需要能够采用任何Python整数。 IE浏览器。比Int更大的东西。
修改
到目前为止,这是迄今为止我从Paolo和Devin的帖子拼凑而成的最佳解决方案。
def hexify(num):
num = "%x" % num
if len(num) % 2:
num = '0'+num
return num.decode('hex')
答案 0 :(得分:6)
您可以使用string formatting:
>>> number = 123456789
>>> hex = "%X" % number
>>> hex
'75BCD15'
答案 1 :(得分:5)
我不确定你想要什么,但是你看过struct
模块吗?
鉴于
>>> hex(123456789)
'0x75bcd15'
你可以这样做:
>>> struct.pack('i', 123456789)
'\x15\xcd[\x07'
请注意'\x5b' == '['
。
此外,您可以撤消字节顺序:
>>> struct.pack('>i', 123456789)
'\x07[\xcd\x15'
编辑:我不确定你的意思是“大于长”,因为AFAIK在python中的长期是无限的(除了记忆)。但是,您可以通过分割和连接来处理更大的整数。例如给出:
>>> n = 123456789012345678901234567890
目标是:
>>> hex(n)
'0x18ee90ff6c373e0ee4e3f0ad2L'
所以:
>>> s = ''
>>> while n >= 2**32:
... n, r = divmod(n, 2**32)
... s = struct.pack('>l', r) + s
...
>>> s = struct.pack('>l', n) + s
看到s
与上面hex(n)
的结果匹配:
>>> s
'\x00\x00\x00\x01\x8e\xe9\x0f\xf6\xc3s\xe0\xeeN?\n\xd2'
答案 2 :(得分:1)
当您执行1234567890时,有时它不起作用并抱怨奇数字符串。
因为它没有意义。你如何在一个2或4位数的空间中安装'AAB'?每个字节是两个十六进制字符。当您有一个奇数个十六进制字符时,所需的结果是不明确的。你想要它相当于0AAB或AAB0吗?如果你知道你希望它与哪一个相同,只需在解码前将该字符添加到正确的位置。
即。 (('0' + foo) if len(foo) % 2 else foo).decode('hex')
其中foo是%x.
答案 3 :(得分:1)
'{0:b}'.format( number )
答案 4 :(得分:0)
正如Paolo所说,字符串格式化是最佳选择。请注意,您可以选择大写和小写字母:
>>> hex = lambda n: '%X' % n
>>> hex(42)
'2A'
>>> hex = lambda n: '%x' % n
>>> hex(42)
'2a'
>>> def escaped(n):
... s = hex(n)
... if len(s) & 1:
... s = '0' + s
... return ''.join(chr(int(s[i:i + 2], 16)) for i in range(0, len(s), 2))
...
>>> escaped(123)
'{'
>>> escaped(1234)
'\x04\xd2'
>>> escaped(12348767655764764654764445473245874398787989879879873)
'!\x01^\xa4\xdf\xdd(l\x9c\x00\\\xfa*\xf3\xb4\xc4\x94\x98\xa9\x03x\xc1'
请注意,转义会在奇数个十六进制数字的情况下添加前导零。此解决方案适用于任何长度的字符串。
答案 5 :(得分:0)
如果知道输出字符串应该有多长,字符串格式化将起作用。例如,要获得四个字符的字符串,您需要格式化长度为8:
>>> "{0:08x}".format(123456789).decode("hex")
'\x07[\xcd\x15'
>>> "{0:08x}".format(1234567890).decode("hex")
'I\x96\x02\xd2'
如果您的号码没有“填满”字符串,这将会添加前缀。例如,使用六个字符的字符串:
>>> "{0:012x}".format(123456789).decode("hex")
'\x00\x00\x07[\xcd\x15'
>>> "{0:012x}".format(1234567890).decode("hex")
'\x00\x00I\x96\x02\xd2'
修改强>
要“检测”目标字符串的长度,您可以使用math.log
函数:
>>> def int2str(n):
l = int(math.ceil(math.log(n, 256) / 2) * 4)
return ("{0:0{1}x}").format(n, l).decode("hex")
>>> int2str(123456789)
'\x07[\xcd\x15'
>>> int2str(1234567890)
'I\x96\x02\xd2'
答案 6 :(得分:0)
对于任意数字,最可靠的方法之一是使用'array'模块,如下所示:
from array import array
binArr = array('B')
while(data):
d = data & 0xFF
binArr.append(d)
data >>= 8
hexStr = binArr.tostring()