我孤身走在路上, 石子在雾中发亮,夜很安静,荒原面对太空,星星互诉衷肠
什么是BASE64
什么是BASE64

什么是BASE64

什么是Base64

BASE64是一种用64个字符表示任意二进制数据的编码方法。它主要用于在需要ASCII字符集进行传输的媒介中,对二进制数据进行编码。这种编码方式可以确保数据在传输过程中不会被修改或损坏,特别是在不支持二进制数据的系统中。

BASE64编码使用的64个字符包括:

  • 大写字母 A-Z(26个)
  • 小写字母 a-z(26个)
  • 数字 0-9(10个)
  • 加号(+)
  • 斜杠(/)

此外,BASE64编码中还会使用等号(=)作为填充字符,用于在最后一个数据块不足3个字节时,填充至4个BASE64字符的长度,以保持编码后的数据完整。

BASE64编码的过程是将三个字节的二进制数据(共24位)划分为四组,每组6位,然后根据这6位的值(0-63)来选择对应的BASE64字符。这样,每3个字节的原始数据就被编码成4个BASE64字符,编码后的数据量大约比原始数据增加1/3。

BASE64广泛应用于电子邮件的MIME编码、网页中的数据URL、密码学和存储系统中的数据编码等领域。

BASE64解决了什么问题,应用场景在哪里

BASE64编码的出现主要解决了二进制数据在不同系统之间传输时可能遇到的兼容性问题。在某些系统或协议中,如早期的电子邮件系统,只能处理纯文本数据,不能正确处理二进制数据,因为这些系统可能会对二进制数据中的某些值进行解释,或者在传输过程中修改它们,导致数据损坏。BASE64编码通过将二进制数据转换为纯文本形式,允许这些数据在文本环境中安全地传输和存储。

BASE64编码的应用场景包括:

  1. 电子邮件(MIME):最早的应用之一是在多用途互联网邮件扩展(MIME)中,用于电子邮件中附件的传输。因为电子邮件标准最初只支持ASCII文本,所以需要将非文本附件(如图片、文档、音频等)编码成文本形式。
  2. 数据URL:在网页开发中,可以使用BASE64编码的数据直接嵌入到HTML或CSS文件中,例如将小图片编码为BASE64字符串并直接嵌入到<img>标签的src属性中,这样可以减少HTTP请求的数量,有时可以提高页面加载速度。
  3. Web服务:在Web服务中,如SOAP和某些RESTful API,可能会使用BASE64来编码二进制文件或其他数据,以便在XML或JSON等文本格式中安全传输。
  4. 密码学:在密码学领域,BASE64常用于编码加密密钥和散列值。例如,证书文件(如X.509证书)通常使用BASE64编码来交换和存储。
  5. 编程和数据存储:在编程中,BASE64编码常用于处理和存储不能直接使用文本表示的数据,如数据库中存储二进制数据。
  6. 令牌和身份验证:在Web身份验证(如JWT,JSON Web Tokens)中,BASE64编码用于编码令牌的各个部分。

BASE64编码的出现使得二进制数据可以在只支持文本的系统中被安全地传输和处理,它在很多需要数据编码的场合都非常实用。

BASE64简单的转换示例

“我爱你”三个中文汉字在UTF-8编码下将分别占用3个字节,合计9个字节。我们来看看将”我爱你”这三个汉字转换成BASE64编码的过程:

  1. 首先,我们需要知道”我爱你”在UTF-8编码下的二进制形式。在UTF-8编码中,汉字通常用三个字节表示,所以我们首先将每个汉字转换成对应的UTF-8编码的二进制形式。

汉字”我”的UTF-8编码是E6 88 91,二进制形式为:
11100110 10001000 10010001

汉字”爱”的UTF-8编码是E7 88 B1,二进制形式为:
11100111 10001000 10110001

汉字”你”的UTF-8编码是E4 BD A0,二进制形式为:
11100100 10111101 10100000

  1. 接下来,将这些二进制数据连在一起,得到一个长串的二进制数:
    11100110 10001000 10010001 11100111 10001000 10110001 11100100 10111101 10100000
  2. 然后,每6位一组划分这串二进制数(不足6位的话在后面补0直到够6位),得到:
    111001 101000 100010 010011 111001 111000 100010 110001 111001 001011 110110 100000
  3. 将这些6位二进制数转换成十进制,然后对照BASE64编码表找到对应的字符:
    111001 -> 57 -> 5
    101000 -> 40 -> o
    100010 -> 34 -> i
    010011 -> 19 -> T
    111001 -> 57 -> 5
    111000 -> 56 -> 4
    100010 -> 34 -> i
    110001 -> 49 -> x
    111001 -> 57 -> 5
    001011 -> 11 -> L
    110110 -> 54 -> 2
    100000 -> 32 -> g
  4. 最后,将这些字符连起来,就是”我爱你”的BASE64编码结果:
    5oiT54ix5L2g

所以,”我爱你”这三个汉字转换成BASE64编码后的结果是”5oiT54ix5L2g”。

补0是否有影响

有的朋友说二进制补0,那不是内容都变了吗? 其实不会的,我慢慢来解释原因。

当BASE64编码中的二进制数据不足6位时,确实需要在后面补0以达到6位,但这并不会改变原始内容。这是因为补位仅发生在最后一个24位的分组中,并且仅用于编码过程。在解码时,这些补位的0会被忽略,确保恢复出的原始数据与编码前的数据完全相同。此外,BASE64编码中还会使用等号(=)作为填充字符,在编码的文本末尾标示实际数据结束的位置,以便在解码时正确处理。

让我们更详细地了解一下这个过程:

  1. 编码时的补位:BASE64编码要求输入数据以3个字节(24位)为一个编码单元。如果最后一个编码单元不足3个字节,就需要在其后面补足0,以形成完整的24位。这些补位的0仅用于编码过程中生成BASE64字符,它们不会影响原始数据的内容。
  2. 输出填充符:在BASE64编码的输出文本中,如果最后一个编码单元少于3个字节,就会在编码的字符串末尾添加一个或两个等号(=)作为填充符。这些等号标示了原始数据的实际长度,并在解码时被忽略。
  3. 解码时的处理:在解码BASE64编码的文本时,解码器会识别填充符,并去掉在编码过程中添加的补位0。这样,解码出的数据会与原始数据完全一致,不会有任何差异。

举个例子,如果原始数据在最后一个编码单元只有1个字节(8位),那么在编码时会在其后面补上16个0以形成一个完整的24位编码单元。在BASE64编码的文本中,这会导致输出两个等号(==)作为填充。解码时,这些补位的0和等号都会被去除,从而恢复出原始的8位数据。

这就是为什么虽然在编码过程中会补位,但不会影响原始内容的原因。BASE64编码和解码是一对可逆的过程,确保了数据的完整性和一致性。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

93 − = 92