欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

BASE64编码规则 为什么只能填充一个或两个等于号,而不是三个等于号 文心一言 通义 chatgpt 有大用 有大大用

Base64编码要求把3个8位字节(3*8=24)转化为4个6位的字节(4*6=24),之后在6位的前面补两个0,形成8位一个字节的形式。 
例如字符串“张3” :
11010101 11000101 00110011 
转换后:
00110101 00011100 00010100 00110011 
用十进制表示即为:53 34 20 51 
这个并不是最终的结果,还需要根据Base64的编码表查询出转换后的值。下面就是BASE64编码表:
Table 1: The Base64 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 (pad) = 
14 O 31 f 48 w 
15 P 32 g 49 x 
16 Q 33 h 50 y 

以上一共是64个编码,这也是Base64名称的由来,编码的编号对应的是得出的新字节的十进制值。因此,上例中字符串“张3”经过编码后就成了字符串“1iUz”了。 

当代码量不是3的整数倍时,代码量/3的余数自然就是2或者1。转换的时候,结果不够6位的用0来补上相应的位置,之后再在6位的前面补两个0。转换完空出的结果就用就用“=”来补位。譬如结果若最后余下的为2个字节的“张”: 
字符串“张” 
11010101 HEX:D5 11000101 HEX:C5 

00110101 00011100 00010100 
十进制53 十进制34 十进制20 pad 
字符’1’ 字符’i’ 字符’U’ 字符’=’ 

这样,最后的2个字节被整理成了“1iU=”。 
同理,若原代码只剩下一个字节,那么将会添加两个“=”。只有这两种情况,所以,Base64的编码最多会在编码结尾有两个“=” 

文章知识点与官方知识档案匹配,可进一步学习相关知识

C技能树首页概览206172 人正在系统学习中

来自  https://blog.csdn.net/SCHOLAR_II/article/details/3877606



base64 为什么只能填充一个或两个等于号,而不是三个等于号

Base64 编码是一种将二进制数据转换为 ASCII 字符串的编码方式,它常用于在文本环境中表示、传输和存储二进制数据,例如在一些邮件协议和网页中。

Base64 编码的原理是将每三个字节(24位)的二进制数据分为四组,每组6位,然后每组6位二进制数转换为一个对应的Base64字符。但是,当原始数据的字节数不是3的倍数时,就需要进行填充(padding)以确保能够分成完整的四组。

填充使用的是等号(=)字符。由于每组需要6位二进制数,所以:

  1. 如果原始数据有1个字节(8位),那么只有前6位会被使用,剩下2位用0填充,并添加一个等号作为填充字符。

  2. 如果原始数据有2个字节(16位),那么前12位会被使用,剩下4位用0填充,并添加两个等号作为填充字符。

由于Base64编码是基于6位二进制数为一组的,所以不可能出现需要三个等号进行填充的情况。三个等号意味着需要额外的18位二进制数进行填充(因为每个等号代表2位填充),但这已经超过了两个完整的6位组(12位)。

因此,Base64编码后的字符串只能以0个、1个或2个等号结尾,分别对应原始数据长度是3的倍数、比3的倍数少1个字节或比3的倍数少2个字节的情况。


base64 为什么只能填充一个或两个等于号,而不是三个等于号

Base64编码是一种将二进制数据转换为文本字符串的方法,常用于在电子邮件、HTTP请求等文本传输协议中安全地携带二进制数据。在Base64编码过程中,原始数据被分成一组组的6位二进制数,然后将每组转换成十进制并映射到Base64字符集的一个字符上。由于Base64字符集共有64个字符(A-Z、a-z、0-9以及+和/,有时还会使用=作为填充字符),因此6位二进制能正好表示Base64字符集中的一个字符。

原始数据的长度往往是任意的,而Base64编码后的数据长度需要是4的倍数,因为每个Base64字符代表6位,而8位字节(1字节)可以分为恰好1.5个Base64字符的6位组(实际上是两个字符加上下一个字符的前两位)。这意味着:

  • 如果原始数据的字节数能够被3整除,编码后不需要填充,因为它们会刚好转换成4的倍数的Base64字符。

  • 如果原始数据的字节数除以3余1,则会有2个剩余的8位字节,即16位二进制,这会被转换成两个Base64字符加上4位的二进制(不足以形成一个完整的Base64字符),此时需要填充2个等号(==)。

  • 如果原始数据的字节数除以3余2,则会有4个剩余的8位字节,即32位二进制,这会被转换成三个Base64字符加上2位的二进制(同样不足以形成一个完整的Base64字符),此时需要填充1个等号(=)。

因此,Base64编码最多只会需要填充两个等号,分别对应于原始数据字节长度模3等于1和2的情况。原始数据长度模3等于0时则不需要填充。不会有需要填充三个等号的情况,因为即使原始数据长度刚好是3的倍数加3(即模3余0,但比最接近的较小的4的倍数多3个字符),额外的数据也会完全转换成Base64字符,而不会留下需要填充3个等号的空间。



普通分类: