【问题标题】:Is there a way to pad to an even number of digits?有没有办法填充到偶数位数?
【发布时间】:2011-05-21 02:24:15
【问题描述】:

我正在尝试创建一些需要传输的数据的十六进制表示(具体来说,在 ASN.1 表示法中)。在某些时候,我需要将数据转换为其十六进制表示。由于数据是作为字节序列传输的,因此如果长度为奇数,则必须用 0 填充十六进制表示。

例子:

>>> hex2(3)
'03'
>>> hex2(45)
'2d'
>>> hex2(678)
'02a6'

我们的目标是为hex2 找到一个简单、优雅的实现。

目前我正在使用hex,去掉前两个字符,然后用0 填充字符串,如果它的长度是奇数。但是,我想找到一个更好的解决方案以供将来参考。我查看了str.format,但没有找到任何填充到倍数的东西。

【问题讨论】:

  • 我认为这和你能得到的一样好,当然除非标准库中有隐藏的宝石......

标签: python string padding


【解决方案1】:

Python 的 binascii 模块的 b2a_hex 保证返回偶数长度的字符串。

那么诀窍就是将整数转换为字节串。 Python3.2 及更高版本已内置 int:

from binascii import b2a_hex

def hex2(integer):
    return b2a_hex(integer.to_bytes((integer.bit_length() + 7) // 8, 'big'))

【讨论】:

    【解决方案2】:

    老实说,我不确定问题是什么。你所描述的一个简单的实现是这样的:

    def hex2(v):
      s = hex(v)[2:]
      return s if len(s) % 2 == 0 else '0' + s
    

    我不一定会称其为“优雅”,但我肯定会称其为“简单”。

    【讨论】:

    • 如果v恰好是long,那么hex(v)将有一个尾随L并且这个函数返回的值也会有它。
    【解决方案3】:
    def hex2(n):
      x = '%x' % (n,)
      return ('0' * (len(x) % 2)) + x
    

    【讨论】:

      【解决方案4】:

      可能想看看 struct 模块,它是为面向字节的 i/o 设计的。

      import struct
      >>> struct.pack('>i',678)
      '\x00\x00\x02\xa6'
      #Use h instead of i for shorts
      >>> struct.pack('>h',1043)
      '\x04\x13'
      

      【讨论】:

      • 不,这与问题无关。请删除或更新您的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      相关资源
      最近更新 更多