有没有办法填充到偶数位数?

Posted

技术标签:

【中文标题】有没有办法填充到偶数位数?【英文标题】: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,但没有找到任何填充到倍数的东西。

【问题讨论】:

我认为这和你能得到的一样好,当然除非标准库中有隐藏的宝石...... 【参考方案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'

【讨论】:

不,这与问题无关。请删除或更新您的答案。

以上是关于有没有办法填充到偶数位数?的主要内容,如果未能解决你的问题,请参考以下文章

1313:例3.5位数问题

怎样找到一组数据的中位数?

2021-11-03:数据流的中位数。中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3,[2,3] 的中位数是 (2 + 3) / 2(

嘎字符串-统计位数为偶数的数字

有没有办法将 tesseract 用于个位数?

算法leetcode1295. 统计位数为偶数的数字(多语言实现)