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

fac*_*cha 47 python formatting

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

例:

Input: [0,1,2,3,127,200,255], 
Output: 000102037fc8ff
Run Code Online (Sandbox Code Playgroud)

我设法提出:

#!/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])
Run Code Online (Sandbox Code Playgroud)

但是,这看起来有点尴尬.有更简单的方法吗?

gak*_*gak 118

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

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


var*_*tec 52

''.join('%02x'%i for i in input)
Run Code Online (Sandbox Code Playgroud)

  • 除了只有一个没有任何解释的代码片段(糟糕的 SO 实践)这一事实之外,我不确定为什么这个答案的投票率低于它下面的答案。在 Python 3 中使用 `%` 语法使其向后兼容。我强烈推荐这个解决方案而不是另一个。 (3认同)

Joh*_*ooy 31

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

  • 没有%格式巫毒的版本的+1 (3认同)

Roe*_*ant 31

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

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

格式选项

旧格式样式是%-syntax:

['%02x'%i for i in [1, 15, 255]]
Run Code Online (Sandbox Code Playgroud)

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

 ['{:02x}'.format(i) for i in [1, 15, 255]]
Run Code Online (Sandbox Code Playgroud)

最近,从 python 3.6 开始,我们接受了以下f-string 语法

[f'{i:02x}' for i in [1, 15, 255]]
Run Code Online (Sandbox Code Playgroud)

格式语法

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

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


Sve*_*ach 16

另一种选择是binascii.hexlify:

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

版画

000102037fc8ff
Run Code Online (Sandbox Code Playgroud)

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

在Python 2.7或更高版本中,您可以通过使用来进一步改进

binascii.hexlify(memoryview(bytearray(a)))
Run Code Online (Sandbox Code Playgroud)

保存bytes呼叫创建的副本.


gak*_*gak 12

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

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


ros*_*ori 6

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

>>> number = 1234
>>> f"{number:04x}"
'04d2'
Run Code Online (Sandbox Code Playgroud)