Base64编码的真正目的是什么?

106
为什么需要Base64编码?作为一个初学者,我真的不明白为什么要将字节混淆成其他东西(除非是加密)。在我读的一本书中,当无法进行二进制传输时,使用Base64编码很有用。例如,当我们提交表单时它会被编码。但是为什么要将字节转换为字母呢?我们不能只是将字节转换为带空格的字符串格式吗?例如,00000001 00000004?或者简单地使用没有任何空格的0000000100000004,因为字节总是成对出现?

12
因为你刚刚将1个字节转换成8个字节,而不是像Base64一样将3个字节转换成4个字节(如果我没记错的话)。带宽是有限的。 - Brian Roach
1
你混淆了比特(8 个比特组成一个字节)和字节,而字节可以以任何形式的分组出现。 - Denys Séguret
4个回答

141

Base64是一种将二进制数据编码为ASCII字符集的方法,几乎所有计算机系统都能识别,以便在传输数据时不会丢失或修改数据本身的内容。

例如,邮件系统无法处理二进制数据,因为它们期望的是ASCII(文本)数据。因此,如果您想传输图像或其他文件,则由于处理数据的方式而导致数据损坏。

注意:base64编码不是加密数据的方法,也不是压缩数据的方法。事实上,经过base64编码的数据比原始数据大1.333倍。它仅仅是一种确保在传输过程中没有数据丢失或更改的方法。


11
Base64编码数据比原始数据要大1.333(3)倍,并且会根据输入数据长度模4的余数而增加0-3个额外字符。这是因为每个Base64编码字符可以存储6位信息(64个不同字符)。 - too
4
无论是数据的前后,它们仍然是二进制的。那么为什么会有数据丢失? - Naresh Teli
我不明白。如果接收者需要将Base64编码的消息解码回原始格式,那么这是否意味着电子邮件系统实际上支持二进制数据? - CrazyMan

19

Base64是一种机制,用于在只允许可打印字符的媒介上表示和传输二进制数据。它是“Base编码”中最流行的形式,其他已知使用的形式包括Base16和Base32。

Base64的需求源于需要将二进制内容(如图像、视频或任意二进制内容)附加到电子邮件中。由于SMTP[RFC 5321]只允许在消息中使用7位美国标准信息交换代码(US-ASCII)字符,因此需要使用这些七位US-ASCII字符来表示这些二进制八位字节流...

希望这回答了您的问题。


4

Base64是传输(实际上是编码,但目的在于传输)任何类型的二进制数据的一种更紧凑的方式。

参见http://en.wikipedia.org/wiki/Base64

“通常规则是选择一个包含在大多数编码子集中且可打印的64个字符的集合。”

这是一个非常通用的目的,常见的需要就是不浪费比必要的空间。

历史上,它基于这样一个事实:存在一个(几乎)所有编码都使用的共同子集,用于将字符存储到字节中,并且很多2^8个可能的字节在简单数据传输期间(例如复制-粘贴-发送电子邮件-接收电子邮件-复制-粘贴序列)会有丢失或转换的风险。

(请将upvote重定向到Brian的评论,我只是让它更完整和清晰)。


1
不,只是太早了,我不想详细回答。这很好。 - Brian Roach

1

在数据传输中,数据可以是文本或非文本(二进制),如图像、视频、文件等。

我们知道,在传输过程中只能发送或接收一串数据(可打印字符),因此我们需要一种方法来编码像图像、视频、文件这样的非文本数据。

非文本(图像、视频、文件)的二进制和ASCII表示很容易获得。这种非文本(二进制)表示被编码为文本格式,使得每个ASCII字符都使用64个可能的字符集中的一个(A-Z、a-z、0-9、+ 和 /)。

                  Table 1: The Base 64 Alphabet

 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

这个包含六十四个字符的字符集被称为Base64,将给定数据编码为这个包含六十四个允许字符的字符集就被称为Base64编码
让我们以一些ASCII字符为例,当它们被编码为Base64时: 1 ==> MQ== 12 ==> MTI= 123 ==> MTIz 1234 ==> MTIzNA== 12345 ==> MTIzNDU= 123456 ==> MTIzNDU2 需要注意以下几点:
- Base64编码是每4个字符一组进行的。因为一个ASCII字符可以有256种字符中的任意一种,需要4个Base64字符来覆盖。如果给定的ASCII值表示的字符数少于4个,则其余字符用=填充。 - =不是base64字符集的一部分。它只用作填充。 因此,可以看出,Base64编码不是加密,而只是一种将任何给定数据转换为可在网络上传输的可打印字符流的方法。

1
我认为有必要提到,base64编码将二进制数据组织成6位一组的块,并在不足6位的块末尾添加0。例如:1 = 49(ASCII)= 00110001(二进制)= 001100 010000(6位块),然后我们将这些块映射到它们的base64对应项-> MQ==。 - madmonkey

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