当您拥有需要通过ascii通道发送的二进制数据时,您使用什么文本编码方案?

时间:2010-01-18 23:34:12

标签: encoding hex base64 base85

如果你有需要编码的二进制数据,你使用什么编码方案?

我知道:

  • Hex encoding。非常简单,但非常详细,将一个字节扩展为两个。
  • Base 64。最常见的,不是那么冗长,将三个字节扩展为四个字节。
  • Base 85。不常见,再次冗长,将四个字节扩展为五个。

是否有其他常用的编码方案?如果是这样,有什么优点和缺点?

编辑:这很有用,例如,在尝试在cookie中存储任意数据时。 Cookie只能存储文本,而不能存储任意数据,因此您需要以某种方式对其进行转换,最好是将其转换回来。此外,假设您正在使用无状态服务器,以便您无法在服务器上保存状态,只需将标识符放入cookie即可。当然,如果你这样做,你还需要一些方法来验证用户传递给你的是你传递给用户的内容,例如签名。

此外,由于目前的共识是你应该使用base64,因为它很普遍,我也会指出这个我使用的...我只是好奇,如果有人使用其他任何东西,如果是的话,为什么。

编辑:万一有人偶然发现,如果您确实想使用Base64在Cookie中存储数据,则需要使用a modified Base64 implementation。请参阅this answer了解原因。

4 个答案:

答案 0 :(得分:13)

要编码cookie值,您需要小心。见older answer

  

使用版本0 cookie,值应该   不包含空格,括号,   括号,等号,逗号,   双引号,斜线,问题   标志,标志,冒号和   分号。空值可能不会   在所有浏览器上表现相同。

Base64编码可以为某些输入生成=符号,这在技术上不允许在cookie中(版本0 cookie,无论如何,这是最广泛支持的)。在实践中,我怀疑=实际上可以正常工作,但可能没有。

我建议绝对确保您的编码二进制文件与cookie兼容,然后基本的十六进制编码是最安全的(例如in java)。

编辑正如@Paul所指出的,有一个modified version of Base 64是“URL安全”(我认为,“cookie安全”)。请注意,使用标准算法的修改版本会淡化其魅力。

编辑:@shoosh指出=仅用于表示base64字符串的结尾,因此您可以修剪=,设置Cookie,然后在需要解码时重新连接=

答案 1 :(得分:4)

Base64获胜,因为它非常普遍,我不必担心滚动我自己的编码器/解码器。我没有遇到任何我一直担心在编码二进制数据中保存带宽或文件空间的应用程序。

答案 2 :(得分:2)

曾几何时,有UTF-7。它已被正式弃用,但仍可用作ACE(ASCII兼容编码)。现在有IDN

答案 3 :(得分:1)

Base64是事实上的标准。使用其他任何东西都是在寻找麻烦。