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

85
我需要从一个随机整数列表(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])

不过,这看起来有点笨拙。有更简单的方法吗?


相关链接:打印包含十六进制元素的列表 - Gabriel Staples
12个回答

180

只是为了完整性,使用现代的 .format() 语法:

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

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

4
除了代码片段没有任何解释(不好的 SO 实践)之外,我不确定为什么这个答案的赞数比下面的答案少。在 Python 3 中使用 % 语法可以向后兼容。我强烈推荐这种解决方案而不是其他的。 - user7851115
@JoshuaDetwiler 这里讨论了%format的区别:https://dev59.com/p2445IYBdhLWcg3wBVrz - Philip Couling

55

在我看来,最近并且更加被推荐的方式是使用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 表示字符串应该是十六进制的。f'{100:02x}''64'f'{100:02d}'(十进制)是'100'f'{100:02b}'(二进制)是'1100100'
  • 02 表示该字符串应左填充零,以达到最小长度 2f'{100:02x}''64'f'{100:30x}'' 64'

有关更多格式选项,请参见pyformat


没错,f-strings是最好的选择!Pyformat.info收集了全面的格式化技巧。虽然它有点过时,因为它仍然认为.format()方法是最新的,但那里提到的所有内容也可以与f-strings一起使用。 - pfabri
1
迄今为止最好的答案。完整包含所有格式选项,每个选项都使用最简单的内置方式。 - MestreLion
毫无疑问,这是最好的答案。关于pyformat的部分是关键。 - rymanso

39

Python 2:

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

Python 3:

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

这可能是Python 3中性能最好的选项,相比于字符串格式化方法(至少根据我自己进行的几次快速测试;您的结果可能有所不同)。 - kgriffs
一个适用于Python 2或3的变体是:import codecs ; str(codecs.encode(bytearray([0,1,2,3,127,200,255]), 'hex').decode()) - Alissa H

18

另一个选择是使用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调用创建的副本。


13

与我的另一个答案类似,只是重复了格式字符串:

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

作为对这个答案的补充:如果你想打印小写十六进制,使用"{:02x}.format(number)"。 - JiaHao Xu

6

从Python 3.6开始,你可以使用f-strings

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

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

打印

000102037fc8ff

(还要注意,您的代码将无法处理10到15范围内的整数。)

1

来自Python文档。使用内置的format()函数,您可以使用'x'或'X'指定十六进制基数

示例:

x = 255 print('数字是 {:x}'.format(x))

输出:

数字是 ff

这里是基数选项:

类型
'b' 二进制格式。以2为基数输出该数字。 'c' 字符。在打印之前将整数转换为相应的Unicode字符。 'd' 十进制整数。以10为基数输出该数字。 'o' 八进制格式。以8为基数输出该数字。 'x' 十六进制格式。以16为基数输出该数字,使用小写字母表示超过9的数字。 'X' 十六进制格式。以16为基数输出该数字,使用大写字母表示超过9的数字。 'n' 数字。与“d”相同,只是它使用当前区域设置插入适当的数字分隔符字符。 无 与“d”相同。


欢迎来到SO!您是否注意到这个问题已经提出了将近10年,并且已经有一个被接受的答案?如果是这种情况,请只在您能够提供真正实质性的改进时回答。 (此外,我认为您误解了问题:它不是关于如何以十六进制格式进行格式化,而是关于特定字符串创建的问题。) - Timus

0

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

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

打印

'000102037fc8ff'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接