【问题标题】:Shortest encoding for 32 bytes of data32字节数据的最短编码
【发布时间】:2013-09-08 15:13:23
【问题描述】:

我有 32 字节的二进制数据要编码。它将被放在一个 URL 中,因此 URL 安全的东西更可取。显然,选择的典型编码是十六进制。这会产生一个 64 个字符的字符串。

我花了很多时间查看各种编码,并想知道,在找不到之后,是否有一些编码可以产生少于 64 个字符但没有填充的输出(只是对于 URL 的清洁度,我宁愿没有填充)。一个有效的选项是类似于 Base 64 的版本,它在解码回二进制时自动确定是否需要填充。

看起来 Base 64 应该能够在没有“=”字符的情况下确定正确的填充量是多少,因为您可以在 base 64 字符串的末尾添加任意数量的“=”符号,并且它将始终成功解码(至少使用 Python 的base64.b64decode())。我可以手动剥离并重新添加填充到 base 64 编码字符串,但对于我的用例,这将是很多额外的字符串操作。

【问题讨论】:

  • 如果您真的关心性能(不要过早优化),最好的解决方案可能是编写自己的 Base64 编码器,不使用填充,并编写使用查找表的解码器(真的没那么复杂)。根据我自己的经验,语言或编码库中包含的大多数编码器/解码器都没有针对速度进行优化(虽然我不能直接与 python 对话)。
  • @Syon 这是一个非常后期的优化。我们正在向公众公开一个已被多个平台使用了一年多的内部 API。编写我们自己的 Base 64 编码器/解码器绝对是一种选择。甚至可以用 C 语言编写并编译为 Python 库。

标签: python encoding hash hex base64


【解决方案1】:

包括电池。

>>> import base64
>>> b64decode_autopadded = lambda b: base64.urlsafe_b64decode(b + '=='[:3 - len(b)%3])
>>> base64.urlsafe_b64encode("somedatastring\0\1").rstrip('=')
'c29tZWRhdGFzdHJpbmcAAQ'
>>> b64decode_autopadded("c29tZWRhdGFzdHJpbmcAAQ")
'somedatastring\x00\x01'

【讨论】:

  • base64.urlsafe_b64encode("somedatastring1\0") == 'c29tZWRhdGFzdHJpbmcxAA=='` 试图避免 == 填充。
  • 仔细阅读问题。我提到了这个解决方案,但我有很多独立的 32 字节二进制块,所以我将剥离/添加填充数以千计,甚至每分钟数百万次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2010-12-19
  • 2017-11-29
  • 2012-03-20
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多