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

发布于 2024-10-06 10:39:15 字数 429 浏览 1 评论 0原文

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

示例:

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

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

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

I'm trying to create a hex representation of some data that needs to be transmitted (specifically, in ASN.1 notation). At some points, I need to convert data to its hex representation. Since the data is transmitted as a byte sequence, the hex representation has to be padded with a 0 if the length is odd.

Example:

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

The goal is to find a simple, elegant implementation for hex2.

Currently I'm using hex, stripping out the first two characters, then padding the string with a 0 if its length is odd. However, I'd like to find a better solution for future reference. I've looked in str.format without finding anything that pads to a multiple.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

沫离伤花 2024-10-13 10:39:15
def hex2(n):
  x = '%x' % (n,)
  return ('0' * (len(x) % 2)) + x
def hex2(n):
  x = '%x' % (n,)
  return ('0' * (len(x) % 2)) + x
好多鱼好多余 2024-10-13 10:39:15

老实说,我不确定问题是什么。您所描述的内容的简单实现如下:

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

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

To be totally honest, I am not sure what the issue is. A straightforward implementation of what you describe goes like this:

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

I would not necessarily call this "elegant" but I would certainly call it "simple."

三生一梦 2024-10-13 10:39:15

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'))

Python's binascii module's b2a_hex is guaranteed to return an even-length string.

the trick then is to convert the integer into a bytestring. Python3.2 and higher has that built-in to int:

from binascii import b2a_hex

def hex2(integer):
    return b2a_hex(integer.to_bytes((integer.bit_length() + 7) // 8, 'big'))
も让我眼熟你 2024-10-13 10:39:15

可能想看看 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'

Might want to look at the struct module, which is designed for byte-oriented 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'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文