【问题标题】:base64 encoding that doesn't use "+/=" (plus or equals) characters?不使用“+/=”(加号或等于)字符的 base64 编码?
【发布时间】:2011-05-22 16:41:48
【问题描述】:

我需要编码一个大约 1000 个字符的字符串,可以是任何字节值 (00-FF)。我不想使用 Hex,因为它不够密集。据我所知,base64 的问题在于它包含 + / 和 = 这是我在我的应用程序中不能容忍的字符。

有什么建议吗?

【问题讨论】:

  • 其实这不是base64的问题,是你的应用有问题。
  • 就像@JeremyP 说的。如果您的应用程序不能容忍+ /= 那么您应该非常非常担心。
  • 有很多“应用程序”不能容忍/,比如在 URL 或文件名中。当然,您可以逃脱它们,但这只会增加另一层,可能会出错或引入安全漏洞。

标签: encoding base64 decoding


【解决方案1】:

Base58Check 是一个选项。它开始成为加密货币地址的事实上的标准。

对 Base64 的基本改进:

  • 只有字母数字字符[0-9a-zA-Z]
  • 没有相似的字符:0OIl / 0OIl
  • 没有标点符号来触发文档和电子邮件中的自动换行或换行
  • 由于没有标点符号,也可以通过单击一次来选择整个值。

Bitcoin Address Utility 是一个实现示例;面向比特币。

注意:新的事实标准可能不足以满足您的需求。目前尚不清楚 Base58Check 编码方法是否会在 current protocols 之间形式化。

【讨论】:

【解决方案2】:

挑选你的替代品。考虑其他一些变体:base64 Variant table from Wikipedia

虽然 base64 编码器/解码器很简单,替换替换可以在现有 base64 编码/解码函数(内部包装器)的简单预处理/后处理步骤中完成 - 无需重新发明轮子(完全)。或者,更好的是,正如 Skeet 先生指出的那样,找到一个具有足够灵活性的现有库。

如果您没有其他合适的“有趣”字符可供选择(可能所有其他字符都无效,只剩下 62 个字母数字字符可供选择),您始终可以使用 转义字符 em> 尺寸略有增加(~3/64?)。例如,0 (A) 将被编码为“AA”,62 (+) 将被编码为“AB”,而 63 (/) 将被编码为“AC”。如果您不想从头开始编写自己的编码器/解码器,这也可以作为前/后步骤来完成。这种方法的缺点是输出字符与输入字节的比例不固定。

【讨论】:

    【解决方案3】:

    如果只是那些特定的字符困扰您,并且您可以找到一些其他字符来代替,那么如何实现您自己的自定义 base64 模块?这并不难。

    【讨论】:

      【解决方案4】:

      您可以改用Base32。比 Base64 密度低,但完全消除了不需要的字符。

      【讨论】:

      • Base32 仍然使用 =,他不能使用它...但是,他可以将其替换为另一个字符,只需要担心 1,而不是 3...
      • @LarryF:如果可以通过其他方式检测长度,可以省略填充,不是吗?
      • 看起来= 填充是可选的,可以很好地解码。仅当您正在执行诸如连接多个 base64 字符串之类的操作时,才需要填充。例如,echo 'foo' | base64Zm9vCg==。但是如果你放弃填充,它仍然可以将echo 'Zm9vCg' | base64 --decode解码为foo
      【解决方案5】:

      正如 Ciaran 所说,base64 实现起来并不难——但您可能希望查看现有的库,这些库允许您指定要使用的自定义字符集。我很确定那里有很多,但你还没有指定你需要它用于哪个平台。

      基本上,您只需要 可接受的 65 个 ASCII 字符 - 最好除了换行符。

      【讨论】:

      • 这是公认的答案,它没有提供任何解决方案。
      • 我第一次(也可能是唯一一次)否决了 Jon Skeet 的回答。
      • @JamesQMurphy:当然,我现在不会这样回答(这是 10 多年前的事了)——但我不能删除它,因为它已被接受,还有其他答案更多细节。
      【解决方案6】:

      当然。为什么不编写自己的 Base64 编码器/解码器,而是在算法中替换这些字符。当然,它不能用普通的解码器解码,但如果这不是问题,那何必担心呢。但是,您最好至少有 3 个其他字符 ARE 在您的应用程序中可用于表示 +/ 和 = 的...

      【讨论】:

      • 假设不需要填充(通常为 =),则只需要两个非字母数字字符。
      • 是的,但我不确定这是您想要做出的假设...除非他确定他的数据长度将始终相同,并且然后,当他添加新字段或其他内容时,这并不能为将来的更新修复它,并且突然间他所有的 B64 代码都中断了,他不知道为什么......
      【解决方案7】:

      base62 本质上是 base64,但只是字母数字。

      【讨论】:

      猜你喜欢
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      相关资源
      最近更新 更多