我知道 .net 支持字节数组的 base64 编码。但我认为如果使用更多的字符,我可以节省更多的空间。我在某处读到 Unicode 支持数千种不同的字符,那么为什么不使用 base1024 编码呢?如果可能的话,您能否就如何实施它提供一些指导。谢谢
4 回答
Base64 有一个目的:以适合 6 位/字符的格式存储/传输二进制数据,以规避某些协议施加的限制。如果你没有这样的限制,base64 不适合你。它从来都不是为了节省空间而设计的。如果您需要节省空间并且可以随意使用任何东西,那么只需将数组存储为二进制数据即可。
base64 的重点是避免编码问题。几乎所有仍在运行的机器都同意 ASCII 字符集。尽管可能仍然有一些 EBCDIC 机器消耗千瓦。ASCII 只编码 96 个明确的字符。Base64 使用其中的 64 个,外加一个填充字符。Base128 已经太多了。
Unicode 没有什么是明确的,常用的编码是 UTF7、UTF8、UTF16、UTF32、UCS-2 及其最小端和大端变体。Base1024 需要 1024 个明确的字符,这对于任何人来说都太多了。请注意,它不能只是一个编码范围,Unicode 图表中有很多漏洞,而且它们是随机分布的。
取决于您使用的是 2 字节 Unicode 编码 (UCS2) 还是多字节 (UTF-8)。Base 1024 只会比 base64 稍微好一点,甚至更浪费空间,因为 base 64 使用 8 位字节中的 6 位。转换为 base64 的原始二进制数据变大了 4/3。(约 1.333 倍增长)
但是使用 UCS-2(16 位)Unicode 字符的 base1024 将仅使用 16 位中的 10 位,因此将占用 8/5 的空间。使用 UCS-2 转换为 base1024 的原始二进制数据将增长到其原始大小的 1.6 倍。这比base64差。
如果您改用UTF-8 Unicode,并且小心地仅使用具有 1 或 2 字节编码的 unicode 字符,则最多可以从 2 个字符中获得 1920 个更多的唯一代码点,这有助于稍微提高数据密度. (UTF-8 编码只使用每个附加的 *bit 字节的 6 位来表示代码点,其他 2 位用于表示后面还有更多字节)
所以这无济于事,您应该在将数据转换为 base64 之前研究压缩数据的可能性。