代码之家  ›  专栏  ›  技术社区  ›  Rob

base64编码:输入字符

  •  2
  • Rob  · 技术社区  · 15 年前

    我试图理解base64编码的输入要求是什么。我非常尊敬的nicholaszakas在这里有一篇文章,他引用了一个规范,如果输入包含任何代码高于255的字符,就应该抛出一个错误 Zakas Article on base64

    在尝试对字符串进行base64编码之前,应该检查字符串是否只包含ASCII字符。由于base64编码要求每个输入字符有8位,因此任何代码高于255的字符都无法准确表示。规范指出在这种情况下应抛出错误:

    if (/([^\u0000-\u00ff])/.test(text)){
            throw new Error("Can't base64 encode non-ASCII characters.");
        }
    

    RFC 3548 但我没有看到任何输入要求,除了:

    如果编码包含字符,则实现必须拒绝该编码 在解释基本编码数据时超出基本字母表,除非 引用本文件的规范明确规定 否则。

    不知道“基本字母表”是什么意思,但也许这就是扎卡斯所指的。但是,如果说他们必须拒绝编码,这似乎意味着这是已经编码的东西,而不是输入(当然,如果输入是无效的,它也会出现在编码中,所以也许这一点是没有意义的)。

    有点搞不清标准是什么。

    2 回复  |  直到 15 年前
        1
  •  7
  •   AakashM    15 年前

    对我来说(第一篇)链接文章有一个基本问题:

    在尝试对字符串进行base64编码之前,应该检查字符串是否只包含ASCII字符

    . 你用base64编码

    而且,他对“ASCII”的检查实际上可以通过 80 ff ,不是ASCII-ASCII只是 00 7f

    现在,如果您有一个字符串,您已经检查它是纯ASCII,那么您就可以安全地将它视为其中字符的ASCII值的字节序列-但这是一个单独的前面的步骤,与base64编码的行为没有严格的关系。

    (我应该说我 就像他一再敦促读者注意base64编码 加密 )

        2
  •  8
  •   Jon Skeet    15 年前

    从根本上讲,谈论“base64编码字符串”是错误的,因为“字符串”的含义是 文本

    Base64编码应用于 二元的 数据(字节序列,如果你想更挑剔的话,也可以是八位字节),结果是文本。输出中的每个字符都是可打印的ASCII文本。base64的全部目的是提供一种将任意二进制数据转换为文本格式的安全方法,该格式可以可靠地嵌入其他文本、传输等。ASCII与几乎所有字符集兼容,因此您不太可能无法将ASCII文本作为其他内容的一部分进行编码。

    当有人谈论“base64编码字符串”时,他们实际上是在谈论使用一些现有编码(例如UTF-8)将文本编码为二进制,然后对结果应用base64编码。什么时候? 解码 ,您需要将base64解码回二进制,然后使用原始编码对二进制数据进行解码,以获得原始文本。