按:base64如今仍然是常见的编码方式,尤其是在“原始数据是二进制,而传输协议只支持文本”的场合。可惜的是,许多开发人员并不清楚其中的原理,只知道“看起来毫无意义,但又有一大堆等号的”就是base64。恰好, 我的朋友胡永浩写了这篇文章,深入浅出讲解了base64,值得认真阅读。
一篇文章彻底弄懂 base64 及其原理
Python资源共享群:484031800
Base32, Base64
Base32 是一个 binary-to-text encoding [1] schemes,顾名思义,就是将二进制数据转换为编码只有基础 32 个字符的数据编码方式, Base64 则是 64 个。注意编码不等同于加密,网上有误解 Base 编码方式为加密方式,实际上标准 Base64 编码解码无需额外信息即完全可逆。
Base 编码常见用途如下:
如定义所言,binary to text
一些协议如 HTTP , FTP (File Transfer Protocol) [当指定发送文本时], SMTP (Simple Mail Transfer Protocol) 是 text-based protocol ,也就是只支持文本传输,不支持二进制传输。是的,http 上传文件,图片时使用的 multipart/form-data 也是需要转成文本的。
所以附件如图片,文件等(binary)就可以用 Base64 编码为 text再传输。
将资源编码为字符串
如 data URI scheme [2] 定义了如下语法来识别网页中的资源:
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"> data:[<media type>][;base64],<data></span>
HTML 中可以在标签中指定识别 Base64编码 来展示资源,
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"><div></span>
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"> <p>Taken from wikpedia</p></span>
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"> <img src="data:image/png;base64, iVBORw0KGgoAAAANSUhEUgAAAAUA</span>
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"> AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO</span>
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"> 9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" /></span>
<span style="max-width: 1000%;box-sizing: border-box;overflow-wrap: break-word !important;"></div></span>
但因为 Base64 是每 3 个原始字符编码成 4 个字符,不够时补 = (下文会详述),因此编码后的大小是有可能会比原文件大的,所以 html 用 Base64 来展示图片而不是用具体的图