网络传输中的那些编码之-base64编码

在前面一篇文章中,这里介绍了URL编码的一些知识点,本文将对网络中另外一个常见的编码方式base64编码进行介绍。

同样的,按照之前的介绍方式,本文将从如下几个方面进行介绍:

  • 什么是base64编码
  • 为什么进行base64编码
  • 对哪些字符进行base64编码
  • 怎么进行编码
  • 使用程序实现base64编解码

什么是base64编码

base64编码是一种编码技术,其将一个字节所代表的的内容(8bit)转换为某一个特定字符集中的字符进行表示。这个特定的字符集包括数字0-9(10个)以及大小写字母(52个),特殊字符+,/,=共计65个可视字符,本质上是一种将二进制转换为文本格式的表示方法。

明明是65个字符,为啥叫base64呢,那是因为用来进行编码的基本字符个数是64个,其中=号是在字节数除以3有余数的情况下,补位使用的,在后面讲述具体如何编码的时候会有所提及。

为什么进行base64编码

前面的文章提到URL编码的目的是解决不同系统以及软件之间的异构性,因为有些ASCII字符在不同的系统中的含义是不同,同时解决一些特殊字符的歧义性,例如空格。同样的base64编码也具有类似的功能,计算机中有很多特殊的字符,经过base64编码之后,转换成固定的字符集,有如下优点:

  • 利于传输,没有特殊字符,不会产生歧义,规避协议中存在一些特殊的控制字符
  • 可视化,能够将不同的编码格式转为成可视字符进行显示,例如有的软件不支持GBK等编码的显示
  • 简单的混淆,没有直接暴露明文,其实这一点算不上优点

当然base64最开始是为了邮件传输进行设计的,其定义在rfc2045中,该RFC是关于多用途邮件扩展(Multipurpose Internet Mail Extensions)的定义,如下图1:
在这里插入图片描述
图1
随后base64逐步扩展到其他的领域,例如web等使用HTTP进行传输的领域。

对哪些字符进行base64编码

跟URL不同的是,在URL编码中,编码的对象是那些特殊的字符,一些常见的数字和字母等字符是可以不进行编码的。base64编码是对于需要编码的部分的所有字符进行编码转换,如下图2:
在这里插入图片描述
图2
图中的Z0部分如果含有&,则可能对于参数的解析会出现问题,因此使用base64编码可以规避这些问题。

怎么进行编码

首先base64是一种二进制到文本字符的编码方式,文本字符的集合为如下的一个数组:

['A',...,'Z' ,'a',...,'z','0',..., '9',+', '/']

共计64个字符,数组中的下标对应各每个字符的编号,例如A字符的编号就是0,字符0的编号就是52,字符+的编号就是62。如下图3:
在这里插入图片描述
图3
当然=这个字符是没有编号的,其作用是作为填充位使用。

其次base64并不是单字节到文本的转换方式,而是三个字节为一组的进行转换,因此就存在如下三种情况:

字节数正好是三的倍数

转换方法如下:

  • 每次取三个字节,共计24位进行转换。
  • 将24位平均的分为四组,每组6个bit。6个bit所能表示的数的范围是0-63,共计64个字符,正好和前面的字符集编号对应上。
  • 对于每组高两位补充0,这样每组变成8bit,4组共计4个字节的二进制。同时仍能够保证每一组表示的数范围是0-63,因为最高两位是0。
  • 最后根据上图3中的映射关系,将每一组数值转换为对应的字符即可。

举例如下图4:
在这里插入图片描述
图4
可以看到字符god的base64编码结果是Z29k。

字节数除三后剩余两个字节

有的时候带转换的字符并不是三字节的倍数,可能会多出来两个字节,处理如下:

  • 同样的按照6bit一组进行分组,得到6bit,6bit,4bit三组
  • 同样6bit的分组高位补充两个0,4bit的那个分组在最高两位以及最低两位分别补充两个0
  • 将三组数按照编号转为为对应的字符
  • 为了表示此种情况是字节数除三后剩余两个字节的情形,需要在末尾加上一个=字符
    举例如下图5:
    在这里插入图片描述
    图5
    可以看到字符go的base64编码字符为Z28=。

字节数除三后剩余一个字节

有的时候带转换的字符并不是三字节的倍数,可能会多出来一个字节,处理如下:

  • 同样的按照6bit一组进行分组,得到6bit,2bit两组。
  • 同样6bit的分组高位补充两个0,2bit的分组在最高两位补充两个0,最低四位分别补充四个0。
  • 将两组数转为为图3中的对应的字符。
  • 为了表示此种情况是字节数除三后剩余一个字节的情形,需要在末尾加上两个=字符
    举例如下图6:
    在这里插入图片描述
    图6
    可以看到字符g的base64编码字符为Zw==。

使用程序实现base64编解码
在python中有专门的库来实现base64的编解码工作,下图7是使用Python的base64库对字符进行编码的执行情况:
在这里插入图片描述
图7

前面也曾提到,base64编码最初是为了解决电子邮件中特殊字符传输问题。但是特殊字符可能会存在任何地方,因此在实际的网络传输中你会发现很多的协议内容为了传输特殊字符,都有采用base64编码的方式进行数据的编码。如上图2中的将参数内容进行base64编码,当然也可以将HTTP request body或者其他的诸如smb协议的内容进行base64编码。

本文为CSDN村中少年原创文章,未经允许不得转载,博主链接这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村中少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值