将 int 格式化为十六进制字符串

我需要从随机整数列表(0-255)中创建一个十六进制数字字符串。每个十六进制数字应该由两个字符表示: 5-“05”,16-“10”,等等。

例如:

Input: [0,1,2,3,127,200,255],
Output: 000102037fc8ff

我想到了:

#!/usr/bin/env python


def format_me(nums):
result = ""
for i in nums:
if i <= 9:
result += "0%x" % i
else:
result += "%x" % i
return result


print format_me([0,1,2,3,127,200,255])

然而,这看起来有点尴尬。有更简单的方法吗?

230042 次浏览
a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))

指纹

000102037fc8ff

(还要注意,对于范围从10到15的整数,您的代码将会失败。)

''.join('%02x'%i for i in input)

巨蟒2:

>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'

巨蟒3:

>>> bytearray([0,1,2,3,127,200,255]).hex()
'000102037fc8ff'

还有一个选择是 binascii.hexlify:

a = [0,1,2,3,127,200,255]
print binascii.hexlify(bytes(bytearray(a)))

指纹

000102037fc8ff

这也是我的机器上最快的大字符串版本。

在 Python 2.7或更高版本中,您可以通过使用

binascii.hexlify(memoryview(bytearray(a)))

保存由 bytes调用创建的副本。

为了完整起见,使用现代 .format()语法:

>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'

除了重复格式字符串之外,与我的其他答案类似:

>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'

使用 python 2.X,您可以执行以下操作:

numbers = [0, 1, 2, 3, 127, 200, 255]
print "".join(chr(i).encode('hex') for i in numbers)

打印

'000102037fc8ff'

在我看来,最近的 首选方法f-string:

''.join(f'{i:02x}' for i in [1, 15, 255])

格式选项

旧的格式风格是 %语法:

['%02x'%i for i in [1, 15, 255]]

更现代的方法是 .format方法:

 ['{:02x}'.format(i) for i in [1, 15, 255]]

最近,从 python 3.6开始,我们开始使用 f-string 语法:

[f'{i:02x}' for i in [1, 15, 255]]

格式语法

请注意,f'{i:02x}'的工作原理如下。

  • :之前的第一部分是要格式化的输入或变量。
  • x表示字符串应该是 heXf'{100:02x}''64'f'{100:02d}'(十进制)是 '100'f'{100:02b}'(二进制)是 '1100100'
  • 02表示字符串应该用 0到最小长度 2左填充。f'{100:02x}''64'f'{100:30x}'' 64'

有关更多格式设置选项,请参见 Pyformat

使用一些美化的示例,类似于 python 3.8中提供的 sep 选项

def prettyhex(nums, sep=''):
return sep.join(f'{a:02x}' for a in nums)


numbers = [0, 1, 2, 3, 127, 200, 255]
print(prettyhex(numbers,'-'))

输出

00-01-02-03-7f-c8-ff

使用内置的 format ()函数,您可以使用“ x”或“ X”指定十六进制基数 例如:

X = 255 Print (‘ the number is { : x }’. format (x))

产出:

号码是 F

以下是基本选项

类型
二进制格式。输出以2为基数的数字。 字符。在打印前将整数转换为相应的 Unicode字符。 “ d”十进制整数。输出以10为基数的数字。 八进制格式。输出以8为基数的数字。 十六进制格式。输出以16为基数的数字,使用小写字母表示9以上的数字。 十六进制格式。输出以16为基数的数字,使用大写字母表示9以上的数字。 N 个数字。这与“ d”相同,只不过它使用当前的区域设置来插入适当的数字分隔符字符。 没有,跟 d 一样。

从 Python 3.6开始,您可以使用 F 弦:

>>> number = 1234
>>> f"{number:04x}"
'04d2'

这可以使用 python string format ()来完成。

密码:

n = [0,1,2,3,127,200,255]
s = "".join([format(i,"02X") for i in n])
print(s)

产出:

000102037FC8FF