在 XML 文档内的系统之间发送二进制内容的最佳方式是什么
我知道 Base64 和 Hex,真正的区别是什么。我目前正在使用 Base64,但需要为此包含一个外部公共库,与 HEX 一样,我认为我可以创建一个函数。
原文由 jax 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 XML 文档内的系统之间发送二进制内容的最佳方式是什么
我知道 Base64 和 Hex,真正的区别是什么。我目前正在使用 Base64,但需要为此包含一个外部公共库,与 HEX 一样,我认为我可以创建一个函数。
原文由 jax 发布,翻译遵循 CC BY-SA 4.0 许可协议
我很好奇 EARTH base64 是如何将 3 个输入字节转换为 4 个输出字节以实现 33% 的空间增长(而十六进制将 1 个输入字节转换为 2 个输出字节以实现 100% 的空间增长)。为什么特别是 3 个输入字节?
答案是:
3 字节 = 3 x 8 位 = 24 位。
为什么是那个神奇的“24 位”数字?那么,基数 64 表示数字 0 到 63。这些数字如何用二进制表示?用 000000 (0) 到 111111 (63)。
答对了!每个 base64 字符使用单个输出字节(单个字符,如“Z”等)代表 6 位输入数据。
所以 24 位(3 个完整的 8 位输入字节)/6 位(base64 字母表)= 4 个字节的 base64。而已!
或者,换句话说,每个 Base64 字符(即 1 个字节(8 位))编码 6 位真实数据。如果我们除以 8 位/6 位,我们会看到 33% 的增长来自何处,如本文顶部所述…所以是的,Base64 总是将数据大小增加 33%(加上 =
的一些潜在填充 ---
有时会在 base64 输出末尾添加的字符)。
您可能会想“为什么不用 base128(7 位输入 = 8 位输出),编码时大小仅增长 14%?”。答案是 base64 是我们能找到的最好的,因为低 128 个 ASCII 字符并非都是可打印的。许多是控制字符,例如 NULL 等。
显然有一些方法可以创建其他系统,例如“base81”等,因为如果您创建自定义编码算法,您可以做任何您想做的事情。但是 base64 的美妙之处在于它如何以 6 位的块如此干净地编码数据,以及您如何只需“读取 3 个字节并输出 4”来编码,以及“读取 4 个字节并输出 3”来解码。因此,该编码方案开始流行。
希望你读完这篇文章后变得更聪明了。
有趣的更新:说到其他具有更多字符的编码风格……我注意到 Ascii85 aka Base85 存在并且效率稍高(编码为 Base85 时数据大小增长 25%,而不是 Base64 时增长 33%): https:/ /en.wikipedia.org/wiki/Ascii85
原文由 Mitch McMabers 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
您也可以为 Base64 编写自己的方法……但我通常建议对两者都使用经过良好测试的外部库。 (这并不像他们有任何短缺。)
Base64 和 hex 之间的区别实际上只是字节的表示方式。十六进制是“Base16”的另一种说法。 Hex 将每个字节占用两个字符 - Base64 每 3 个字节占用 4 个字符,因此它比 hex 更有效。假设您使用 UTF-8 对 XML 文档进行编码,一个 100K 的文件将需要 200K 以十六进制编码,或 133K 以 Base64 编码。当然,您很可能并不关心空间效率——在许多情况下这无关紧要。如果 确实 重要,那么显然 Base64 在这方面更好。 (有更有效的替代方案,但它们并不常见。)