大多数编号系统从零开始,以10为底的数字,然后在以10为底的数字用尽后转到字母:
Run Code Online (Sandbox Code Playgroud)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
甚至字符的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 个不同的符号,无论符号是什么及其顺序)。
| 归档时间: |
|
| 查看次数: |
186 次 |
| 最近记录: |