代码之家  ›  专栏  ›  技术社区  ›  Paul Wagland

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

  •  7
  • Paul Wagland  · 技术社区  · 15 年前

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

    我知道:

    • Hex encoding . 非常简单,但相当冗长,将一个字节扩展为两个字节。
    • Base 64 . 最常见的,不是很冗长,而是将三个字节扩展到四个字节。
    • Base 85 . 不常见,不再那么冗长,将四个字节扩展到五个字节。

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

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

    另外,由于目前的共识是您应该使用base64,因为它很普遍,我还将指出这一点 我使用的…我只是好奇是否有人使用其他东西,如果有,为什么。

    编辑 :为了防止有人遇到这种情况,如果要使用base64将数据存储在cookie中,则需要使用 a modified Base64 implementation . 见 this answer 原因是。

    4 回复  |  直到 15 年前
        1
  •  13
  •   Community Romance    7 年前

    对于编码cookie值,需要小心。请参见 旧答案 ::

    < Buff行情>

    对于版本0 cookie,值应该 不包含空格、括号, 括号, 等号 ,逗号, 双引号、斜杠、问题 标志、标志、冒号和 分号。空值不能 在所有浏览器上的行为方式都相同。

    < /块引用>

    base64编码可以为某些输入生成 = 符号,而在cookies(版本0 cookies,anyway,which are the most wide supported)中技术上不允许这样做。在实践中,我怀疑 = 实际上工作正常,但可能不会。

    我建议绝对确定您的编码二进制是Cookie兼容的,那么基本的十六进制编码是最安全的(例如< http://cords.Apache .org/CoDEC/ APIDOCS/org/Apache/CONDEN/CODEC/二进制/HEX.html HTML编码(字节[])”Re=“NoFoLoLoeForver”>在Java中。

    编辑: as@paul helpfully pointed out,there is a modified version of base 64 that is“url safe”(and,i assume,“cookie safe).使用标准算法的修改版本会削弱其魅力,请注意。

    edit :@shoosh指出, = 仅用于表示base64字符串的结束,因此可以修剪 = ,设置cookie,然后重新附加 = again when you need to decode it.

    :

    对于版本0 cookie,值应该 不包含空格、括号, 圆括号, 等于符号 逗号, 双引号、斜杠、问题 标志、标志、冒号和 分号。空值不能 在所有浏览器上的行为都相同。

    可以生成base64编码 = 某些输入的符号,这在技术上是不允许在cookies(0版cookies,无论如何,这是最广泛支持的)。实际上,我怀疑 = 实际上工作得很好,但可能不行。

    我建议,为了绝对确保编码的二进制文件与cookie兼容,那么基本的十六进制编码是最安全的(例如 用Java语言 )

    编辑: 正如@paul乐于指出的那样,有一个 modified version of Base 64 这是“URL安全”(我假设是“cookie安全”)。请注意,使用标准算法的修改版本会削弱它的魅力。

    编辑 :@shoosh指出 = 只用于表示base64字符串的结尾,因此可以修剪 = ,设置cookie,然后重新附加 = 当你需要解码的时候。

        2
  •  4
  •   jball    15 年前

    base64之所以会赢,是因为它是如此常见,以至于我不必担心自己的编码器/解码器会滚动。我还没有遇到过任何担心在编码二进制数据中节省带宽或文件空间的应用程序。

        3
  •  2
  •   bmargulies    15 年前

    从前,有一种UTF-7。它被正式否决了,但它仍然作为一个ace(与ascii兼容的编码)工作。现在有 IDN .

        4
  •  1
  •   shoosh    15 年前

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