base64编码不使用"+/="(加号或等号)字符?

Pet*_*ner 10 base64 encoding decoding

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

有什么建议?

小智 11

选择你的替代品.考虑一些其他变体:来自维基百科的base64 Variant表.

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

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


Lat*_*tal 9

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

与Base64相比的基本改进:

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

比特币地址实用程序是一个实现示例; 面向比特币.

注意:新的事实标准可能不足以满足您的需求.目前还不清楚Base58Check编码方法是否会在当前协议中形式化.

  • 我想要这样的编码已经五年了,我希望我早点意识到它。 (3认同)
  • 这是一个准备好在 c# 中实现 Base58 https://gist.github.com/dotnetchris/8e99ef70a6fcb3bd445ef1f3505f7087 (2认同)

Cia*_*ing 6

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


Jon*_*eet 1

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

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

  • 这是如何接受的答案,它没有提供任何解决方案。 (35认同)
  • @JamesQMurphy:当然,我现在不会这样回答(这是十多年前的事了)——但我不能删除它,因为它已被接受,而且还有其他更详细的答案。 (2认同)