为什么base64编码后的字符串大小比原文件大?

23

我的原始PDF文件大小约为24MB,但是当我将其编码为base64字符串时,字符串大小约为31MB。我想知道为什么。

对于图像文件来说这很容易理解,因为它可能会失去一些压缩,但是对于PDF或其他格式的文件也会发生吗?


7
同样的原因,二进制中的数字 9 表示为 1001,占用了四倍的空间!你正在从256进制转换为64进制,这将带来一些空间上的收益——通常是33%,因为64进制不会愚蠢,并包含一些数据重新打包的技巧。 - Niet the Dark Absol
1
有关编程的内容,请将以下文本从英语翻译成中文。仅返回已翻译的文本:有意义,感谢@Niet the Dark Absol - leonsPAPA
1个回答

46
因为Base64每个字节的意义位数比二进制数据格式少(通常是6而不是8)。这是为了使其能够在二进制数据无法生存的各种文本转换中生存下来。 维基百科页面上有一个很好的图表显示了这一点。

enter image description here

作为文本表格(遗憾的是,SO使用的GitHub风格的markdown不支持具有不同列数的表格):
+−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
|   Text content  |               M               |               a               |               n               |
+−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
|     ASCII       |           77 (0x4d)           |           97 (0x61)           |          110 (0x6e)           |
|  Bit pattern    | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
|     Index       |           19          |           22          |           5           |           46          |
| Base64−encoded  |           T           |           W           |           F           |           u           |
+−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−+−−−−−−−−−−−−−−−−−−−−−−−+

请注意,Base64仅使用每个字节的最低6位,因此“Man”最终变成了四个字节。
对于图像文件来说很容易理解,因为它可能会失去一些压缩。
需要明确的是,Base64编码是无损的。解码后,您将得到与开始时完全相同的字节。

4个字节长?我数了3个字节和4个ASCII字符... - undefined
@AnnaKlein - 在Base64中,这4个ASCII字符每个占用一个字节,因此Base64文本占用4个字节。(当然,在任何压缩之前,压缩不在讨论范围内。) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接