数据结构和算法(一):常用编码算法Base64的前世今生


前言:数据结构和算法是广大程序猿的痛点,当然对我来说也是,所以这段时间我自己也是在狂补数据结构和算法相关的知识,因为个人对数据结构和算法研究不是很深入,基本在学习的过程都是借鉴别人的博客以及自己购买的学习课程。从深度来说,是远远不够的,如果您阅读这系列博客觉得都太简单小儿科,可以将您深入的理解投稿给我,分享给积极学习的小伙伴们。但我相信,这些内容对绝大多数人都是不可多得的好材料。在写文章的时候我会把具体借鉴的文章地址做说明,如果是相关课程的话,我会给出具体课程所在位置以及购买的邀请码。

几年前面试的时候,数据结构和算法基本都是不问的,但是这几年随着程序猿数量的增加,互联网红利的下滑,面试越来越严格,要求也越来越高。源码+数据结构+算法都是家常便饭啦。对于有跳槽想法的你我,及时的补充数据结构和算法知识可是迫在眉睫的事情。

第一篇我们来一起认识一下Base64的前世今生。

参照”程序员小灰”公众号关于Base64讲解的文章

地址:漫画:什么是Base64算法?

1. ASCII码的原理

为什么要说ASCII码呢,因为出现Base64和这个是有所关联。

ASCII的范围是0127,总共是128个字符,其中031和127这33个字符属于控制字符,剩下的32~126这95个字符属于可打印字符,包含数字、大小写字母和常用符号。

在早期的一些传输协议,例如传输邮件的SMTP协议,只能传输可打印的ASCII字符。导致原本8Bit字节码(0~255)超出了可用的范围。比如邮件传输图片资源的时候,有一个Byte值是10111011B,对应十进制是187不属于ASCII码的范围,因此无法被传输。

这时候,Base64编码就应运而生啦。具体Base64是如何解决的呢?

2. Base64概述

Base64是一种编码算法,为什么叫Base64呢?因为这种算法只支持64个可打印字符。分别是26个大写字符、26个小写字母、10个数字以及+/两个字符。

Base64巧妙的使用6Bit字符表示原本的8Bit字符,这样可以将字符控制在可打印的范围内,可以囊括原本ASCII码中所有的字符。甚至可以将ASCII码之外的字符都转换成可打印的6Bit字符。

那到底是怎么将原本字节码是8Bit转换成成6Bit的呢?

3. Base64转换原理

Base64转换到底是怎么完成的呢?我们都知道8和6的最小公倍数是24,这样就可以使用4个Base64字符来表示3个传统的8Bit字符。这样有点抽象,且看下面的图片:

从图中可以知道,将原来的数据按照8Bit排列,然后用6Bit来截取,将截取的数据转换成10进制,这样就可以在Base64表中找到对应的字符。

这个例子是理想状态,如果原字符个数不是3个,而是4个,这个时候对应的8Bit位数就是32,不是最小公倍数的倍数,此时就需要使用0进行补位,补位后的位数必须是24的倍数,32加上8不能满足要求,只能是加上16,这样就可以啦,但是对应后两位都是0,这个时候就用=来替代,如下图:

通过这一个操作就可以看出来,为什么Base64加密后经常在编码后的字符串后面出现=啦。

4. Base64表

Base64对照表和ASCII的对照表不一样,这里需要注意一下,Base64对照表如下:


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 上一篇
Redis学习笔记(五):redis使用的RESP报文格式和手写Redis简易客户端 Redis学习笔记(五):redis使用的RESP报文格式和手写Redis简易客户端
Redis客户端和服务端交互是通过tcp协议,在通讯的报文格式使用的是RESP协议规范,也就是意味只要和Redis服务端建立Scoket连接,通过RESP报文格式传输数据就可以实现Redis客户端和服务端的交互。看起来是很简单的,但是实际上的确是这么简单,RESP报文格式的可读性也是很高的。
2019-08-16
下一篇 
一起谈谈设计模式(三):单例模式4种最终版 一起谈谈设计模式(三):单例模式4种最终版
关于单例模式有很多种实现方式,这些大家都是很熟悉了,各种博客也是写了N中方法,这些博客都看了一圈,但是很多就是一样的,有的标题是九种,其实还是那么核心的几种变来变去,还有把懒汉模式的安全和非安全分为两种,还有更厉害的是把懒汉基本写法、双重检查机制、双重检查机制+volatile三种分开,认为是三种写法,这是懒汉模式从非安全到安全的演变,完全就是一种模式,感觉完全都是在凑字数(如果这样凑,我估计能写出十几种,甚至更多)。总结一下其实只有四种,再怎么变都是离不开这四种写法。
2019-08-09
  目录