base64编码原理
*简单介绍
Base64是一种最常见的二进制编码方法。用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符。所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。
base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,用来将非ASCII字符的数据转换成ASCII字符的一种方法,因为某些系统中只能使用ASCII字符。Base64编码,它要求把每3个8Bit的字节转换为4个6Bit的字节,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。Base64编码可用于在HTTP环境下传递较长的标识信息,编码的数据不会被人用肉眼所直接看到,适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
*编码原理
Base64编码表由64个字符组成,编码后的字符由表中字符组合而成,流程如下:
- base64的编码都是按字符串长度,以每3个8bit的字符为一组。
- 然后针对每组,首先获取每个字符的ASCII编码。
- 然后将ASCII编码转换成8bit的二进制,得到一组3*8=24bit的字节。
- 然后再将这24bit划分为4个6bit的字节,并在每个6bit的字节前面都填两个高位0,得到4个8bit的字节。
- 然后将这4个8bit的字节转换成10进制,对照Base64编码表,得到对应编码后的字符。
注:
- 由于要求被编码字符是8bit,所以须在ASCII编码范围内,\u0000-\u00ff,中文就不行。
- 由于2^6=64,而以1个6bit为一个单元,因此一定能在0~63的编码表中找到对应的编码!
- Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
举例如下:
* 简单Python实现
Python内置的base64可以直接进行base64的编解码:
1.在终端下的运行:
编码与解码的处理对象是byte,故对原数据要先编码,使原本的str类型变成byte,解码后直接输出来的是byte对象,故要解码成str对象。
注:为了区别字符串,前缀b表示byte二进制。
-
在pycharm编辑器里的测试:
有时编码结果会出现等号:
如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节。Base64会用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号(最多2个=号),表示补了多少字节,解码的时候,会自动去掉。
因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。
Debug
是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于逐指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围。
我觉得debug调试工具,对程序员来说很重要。我们能通过自己动手调试,从而发现自己程序的错误,从而高效有方向的修改代码。
Socket
- 介绍
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
网络中的进程是通过socket来通信的,socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)。 - socket的基本操作
socket是“open—write/read—close”模式的一种实现,那么socket就提供了这些操作对应的函数接口。 - socket()函数
int socket(int domain, int type, int protocol);
socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
转载:https://blog.csdn.net/HanWinter/article/details/101558491