base64

Base64是一种基于64个可打印字符([A-Za-z0-9+/])来表示二进制数据的表示方法。

Base64 计算过程

Base64基于64个可打印字符,所以每一个Base64编码单元只需要log2(64) = 6个位元。而计算机的计量单元是8个位元,6与8的最小公倍数是24,所以可以使用24个位元(也就是三个字节)作为一个编码处理单元。该编码处理单元规则如下:

  • 第1个字节的前6个位元作为Base64编码的第1个编码单元;
  • 第1个字节的后2个位元和第2个字节的前4位作为Base64编码的第2个编码单元;
  • 第2个字节的后4个位元和第3个字节的后4位作为Base64编码的第3个编码单元;
  • 第3个字节的后6个位元作为Base64编码的第4个编码单元。

引用维基百科的例子:
Base64编码示例

补足空缺位元

在Base64编码中,是以24个位元(3个字节)作为一个编码处理单元的,那就可能出现提供的位元不足3个字节(缺1个或2个字节)。处理方法如下:

  • 如果缺1个字节,使用0来填充,在Base64编码结果后面加1=来说明填充了1个字节;
  • 如果缺2个字节,使用0来填充,在Base64编码结果后面加2=来指明填充了2个字节;
  • 后面全部由0填充所产生的字符都需要进行删除。如果填充了1个字节0,则需要删除Base64字符序列(未填充"="前)的最后一个字符(000000对应的字符是A);如果填充了2个字节0,则需要删除Base64字符序列(未填充"="前)的最后两个字符(实际上该字符是A)。

Base64 URL Safe

24.3节的Base64编码结果不能直接用作URL的参数传输,因为Base64的"+","/","="分别对应于URL中的空格、路径分隔符和key=val分割符,如果直接用于URL传参,则会扰乱URL的语义。为了可以让Base64编码在URL使用,人们将Base64中的"+""/"替换成"-""_",同时不再使用"="进行末尾填充。

Base64应用场景

将图片内嵌到img标签

HTML5中可以使用伪协议data,将图片以base64的编码内嵌到img标签中。

<img alt="" src="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAAaABwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6X+HXgm4+It/dlrxdP0uxQSXV44BCg5wBkgZIBOTwACT2B1de+Gfh3V9B1LUPBHihNdm0xPMurUujErgncpUDghWI4IbBweK5j4MeOdHhtvE/hPXbl7Gy8QWnkx3wjLJCwVw3mHPClXzkgKNhDH5hXoHwl8FaH4V1DWIdN8b6Nr3iS+sJYrO0trpNoTg73VWYnkL0HADYzzj9Xx1evhK1STm48vLyrlvGS0u27evVWsfjOXZfhsXh6UPZqXPzc8ua0ovXlSV/To73OOvPgdq9zaNJour6XrlzAo+1WlvcKskD4yVPOPxJH0ryI6jk8MCPUHINei+DdOn+Hvwt+KV88CxalbtHoxaAqTGWk2S7WH/XQHP+zXin2/HAIx9K+oy32tWVWM5qcYtJO1r+6m9na2qsfHZvhsPSjRlSpuEpptxbva0nFbq99Hc9M/Zt8a2OjfEdrHU7tbKy1iymsGuzKIjA5AZXEnBU/IVGD1cegqdNM+DPgzUYxefELWtb1K2cMtz4didERhn5lmUNk+6vnmvny6AcFWG5T1B6VUckZ5r1KmTqrXlWjVlBSSTUba2vrdpvZ2srHoUsy9jh4UZUozcG2m76Xt0TXVbs96+Jvxl8OSeCIvBHgKznttCkdZ7++vUKz3MgcOBzyTuVSzHsAoGM1499uHrWIWPHJruPA1lb3OkytNBFKwnI3OgY42r6120MHRy2i40ru7u23dtvq33POxWIqZjVU6tlZWSSskl0SP/Z" />

显示结果:

results matching ""

    No results matching ""