有没有办法填充到偶数位数?
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'
【讨论】:
不,这与问题无关。请删除或更新您的答案。以上是关于有没有办法填充到偶数位数?的主要内容,如果未能解决你的问题,请参考以下文章
2021-11-03:数据流的中位数。中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3,[2,3] 的中位数是 (2 + 3) / 2(