为什么base64以A而不是0开头?

mar*_*tin 5 base64

大多数编号系统从零开始,以10为底的数字,然后在以10为底的数字用尽后转到字母:

Binary:      0,1  
Octal:       0,1,2,3,4,5,6,7  
Decimal:     0,1,2,3,4,5,6,7,8,9   
Hexidecimal: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
Run Code Online (Sandbox Code Playgroud)

甚至字符的ASCII顺序也有数字位于字母之前。

Base64编码方案的作用有所不同:

    ????????????????????????????????????????????????????????????????????????????
    ?Value ? Encoding ??Value ? Encoding ??Value ? Encoding ??Value ? Encoding ?
    ????????????????????????????????????????????????????????????????????????????
    ?  0   ?    A     ?? 17   ?    R     ?? 34   ?    i     ?? 51   ?    z     ?
    ?  1   ?    B     ?? 18   ?    S     ?? 35   ?    j     ?? 52   ?    0     ?
    ?  2   ?    C     ?? 19   ?    T     ?? 36   ?    k     ?? 53   ?    1     ?
    ?  3   ?    D     ?? 20   ?    U     ?? 37   ?    l     ?? 54   ?    2     ?
    ?  4   ?    E     ?? 21   ?    V     ?? 38   ?    m     ?? 55   ?    3     ?
    ?  5   ?    F     ?? 22   ?    W     ?? 39   ?    n     ?? 56   ?    4     ?
    ?  6   ?    G     ?? 23   ?    X     ?? 40   ?    o     ?? 57   ?    5     ?
    ?  7   ?    H     ?? 24   ?    Y     ?? 41   ?    p     ?? 58   ?    6     ?
    ?  8   ?    I     ?? 25   ?    Z     ?? 42   ?    q     ?? 59   ?    7     ?
    ?  9   ?    J     ?? 26   ?    a     ?? 43   ?    r     ?? 60   ?    8     ?
    ? 10   ?    K     ?? 27   ?    b     ?? 44   ?    s     ?? 61   ?    9     ?
    ? 11   ?    L     ?? 28   ?    c     ?? 45   ?    t     ?? 62   ?    +     ?
    ? 12   ?    M     ?? 29   ?    d     ?? 46   ?    u     ?? 63   ?    /     ?
    ? 13   ?    N     ?? 30   ?    e     ?? 47   ?    v     ??      ?          ?
    ? 14   ?    O     ?? 31   ?    f     ?? 48   ?    w     ??(pad) ?    =     ?
    ? 15   ?    P     ?? 32   ?    g     ?? 49   ?    x     ??      ?          ?
    ? 16   ?    Q     ?? 33   ?    h     ?? 50   ?    y     ??      ?          ?
    ????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

base64选择在数字之前写字母是否有原因?0用编码表示该值是否更有意义0

小智 1

我最近正在研究一般的基本转换,并遇到了这个完全相同的问题。有趣的是,六年多来没有人对此发表任何评论。虽然我没有具体的答案,但这里有一些支持信息:

  • 您提到的“Base64”被称为“RFC 4648”。我找到并阅读了相关规范,最后它提到了各种贡献者姓名和 RFC 的主要作者:Simon Josefsson。那里有一个联系电子邮件,所以如果有人知道答案,这可能是一个开始的地方。

  • RFC 4648 没有什么神圣之处,这意味着“Base64”本质上不需要遵守该推荐标准。当然,不同的图书馆已经以这种方式跨多种语言实现了它,并且它最终被广泛用于编码电子邮件 - 并且显然在跨古代电子邮件系统传输二进制图像数据方面表现良好。

但在我看来,RFC 4648 的使用“只是因为”遗留的建立,而不是因为它是“最佳”解决方案。对这个“Base64”的每一个解释都只是从解释 6 位组的划分开始,等等,而没有深入了解更根本的“为什么”。也就是说,这些文章似乎假设该 RFC 4648 是 Base64 编码的“the”标准(而不是“a”标准)。如果我们使用更直接的方法,从 0-9 而不是 AZ 开始,那么跨系统传输二进制数据的基本目标会发生哪些破坏或变化?对于任何一般的基本转换,您只是索引到一系列“可接受的可打印字符”(并且任何解码器都必须认识到所使用的原始系列)。无论如何,我同意从字母开始而不是数字开始的转变看起来“奇怪”,没有明显的理由。

这并没有回答具体问题,但我希望它能引发更多关于它的讨论。我们可能只需要设置一个实验“如果我们只改变所使用符号的顺序会怎样”,也许一些实际原因可能会显现出来。一个原因可能只是这种转变是一种故意混淆,以使任意“安全符号集”用于传送二进制数据的目的变得不那么明显。

编辑:关于“混淆”作为答案,请考虑......在给定的数据流中,人们通常会认为“0”或“00”确实意味着数字值0(或00000000的二进制字节序列)。相反,在此 RFC 4648 中,“A”表示 000000(或 6 位 0 序列)。因此它是“Base 64”,因为涉及一组 64 个符号。但是,一旦定义了一组“基本符号”,您就可以将其转换为任何 Base-N(假设您有足够的符号)。因此,无论您的序列是什么,当您的 Base-64 与作为“Base-64 标准”提出的 RFC 4648 不一致时,现在“感觉不对”。但 RFC 4648 的范围和目的似乎不仅仅是 Base-64 的通用方法(该范围涉及一些可能不支持 8 位甚至 7 位处理的中间处理系统 - 对于大多数人来说主流开发人员可能很难理解这样的系统仍然存在)。不管怎样,当对“Base-64”的解释立即跳到解释 RFC 4648 而不是仅仅解释 Base-64 在概念上与任何其他基数相同(只是它有 64 个不同的符号,无论符号是什么及其顺序)。