【问题标题】:Format ints into string of hex将整数格式化为十六进制字符串
【发布时间】:2011-08-05 10:13:25
【问题描述】:

我需要从随机整数 (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])

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

【问题讨论】:

标签: python formatting


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:
    ''.join('%02x'%i for i in input)
    

    【讨论】:

    • 除了只有一个代码 sn-p 没有任何解释(糟糕的 SO 实践)之外,我不确定为什么这个答案的投票率低于它下面的答案。在 Python 3 中使用 % 语法使其向后兼容。我强烈推荐这个解决方案而不是另一个。
    • @JoshuaDetwiler % vs format 在这里讨论:stackoverflow.com/questions/5082452/string-formatting-vs-format
    【解决方案3】:

    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 与字符串格式化方法相比性能最高的选项(至少基于我自己运行的一些快速测试;您的里程可能会有所不同)。
    • 适用于 Python 2 或 3 的变体是:python import codecs ; str(codecs.encode(bytearray([0,1,2,3,127,200,255]), 'hex').decode())
    【解决方案4】:

    我认为最近的首选方法f-string

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

    格式选项

    旧格式样式是%-syntax:

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

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

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

    最近,从 python 3.6 开始,我们被视为f-string syntax

    [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 填充到最小长度2f'{100:02x}''64'f'{100:30x}'' 64'

    【讨论】:

    • 是的,一直是 f 弦! Pyformat.info 拥有全面的格式化技巧。虽然它有点过时了,因为它仍然认为.format() 方法是最近的,所以那里提到的所有内容也可以与 f-strings 一起使用。
    • 迄今为止最好的答案。包含所有格式选项,每个选项都使用最简单的内置方式。
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

      • 作为对这个答案的补充:如果你想以小写形式打印十六进制,请使用“{:02x}.format(number)`
      【解决方案7】:
      a = [0,1,2,3,127,200,255]
      print str.join("", ("%02x" % i for i in a))
      

      打印

      000102037fc8ff
      

      (另请注意,对于 10 到 15 范围内的整数,您的代码将失败。)

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

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

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

          打印

          '000102037fc8ff'
          

          【讨论】:

            【解决方案10】:

            一些美化的例子,类似于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
            

            【讨论】:

              【解决方案11】:

              来自Python documentation。使用内置的 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 年前提出的并且有一个公认的答案?在这种情况下,请仅在您可以提供真正实质性的改进时才回答。 (此外,我认为您误解了这个问题:这不是关于如何以十六进制格式化,而是关于特定字符串的创建。)
              【解决方案12】:

              使用 python string format() 可以做到这一点。

              代码:

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

              输出:

              000102037FC8FF
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2022-07-08
                • 2015-11-29
                • 2017-08-12
                • 1970-01-01
                • 2015-04-30
                • 2014-12-15
                相关资源
                最近更新 更多