python binascii中uu, basse64, qp, hqx 编码与解码

python的binascii模块中包含了几种二进制与可打印字符串相互转换的几种常用编解码函数。dir查看一下:

主要包括:uu(Unix-to-Unit encoding),  base64, qp(Quoted-Printable), hqx(binhex) 四种编解码方式。它们都有共同的一个目标,就是把所有的二进制内容转成可打印的字符串,方便在程序间,网络, email上传输。下面是对这几种编解码理解的笔记:

UU:全称Unix-to-Unix encoding

编码过程是:每输入3个字节(3X8bit),平均分成4份(4x6bit),每份有6bit, 前面加2bit补全成为8bit, 然后每位加上0X20。 还有2个规定:

  1. 其中如果加0x20后是0x20(也就是说没加之前是0x00),那转成0x60(估计是为了避开空格0x20)。
  2. 如果输入不够3个字节,就用0(0x00)在后面补全成为3位。

所以uu编码后的所有字符都落在0X21-0X60之间, 如下图红线之间的字符, 因为3字节变4字节,所以长度变大了。

ascii-uu-encoding

http://blog.csdn.net/taozpwater/article/details/8074896抄来一段C实现的编解码代码:

uu编码:

uu解码:

主要参考:

http://web.chacuo.net/charsetuuencode

http://blog.csdn.net/jeketl/article/details/555553

http://blog.csdn.net/L_thread/article/details/5974749

 

base64:

base编码思想跟uu很像,也是3字节变4字节,分了之后的处理开始不一样了。不加0x20了,而是做一个查表操作,一一对应一个可打印字符,表格如下:

ascii_base64_encoding

同样如果输入不是3的整数倍,在后面补0(0x00),然后加上对应个数的=号,补一个=号表示补了一个0,补二个=号表示补了二个0。

发现没有,索引为62,63的+号和/号,在一些场合不能使用的,如URL中,这时会相应变成其它的符合如-和_。

主要参考:

http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001399413803339f4bbda5c01fc479cbea98b1387390748000

http://baike.baidu.com/link?url=p9ZwPqUBPRJt4Qe7b4u88QILHohAPcP1kEiejOxIXfwuiCKXoDz89T1w3gGBmUVMihvhr7IlZ3xbwiP0VPT1Oq

http://base64.xpcha.com/

 

Quoted-printable:

编码的基本方法是:输入数据在33-60、62-126范围内的,直接输出;其它的需编码为”=”加两个字节的HEX码(大写)。为保证输出行不超过规定长度,可在行尾加“=\r\n”序列作为软回车。等号”=”(十进制值为61)必须表示为”=3D”。跟uu,和base64不一样的是这里不做3字节转4字节的操作了。直接判断一下范围就做转换了。

ascii_qp_encoding

主要参考:

http://biancheng.dnbcw.info/216/216040.html

http://web.chacuo.net/charsetquotedprintable

 

hqx(binhex):

这个编码方式查也很多资料都没有明确的定义,都是说跟苹果系统有关的文件会用到这种编码。终于有在github上找到一个不太官方的总结,凑合着看吧。也不知道正确性如何,后面再验证一下。

https://gist.github.com/i-e-b/fe0a0158ae61973802a9

大约的编码方式:也是3字节转4字节,然后查表, 有效的字符如下,也是64个。

!”#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr

hqxbinhex-codes

符上github上的原文,时间是2016-12-01复制过来的。

binascii官方DOC:

https://docs.python.org/2/library/binascii.html

其中有hexlify(),和unhexlify()应该比较常用的函数。

 

还有相关网页的一些用法:

http://blog.csdn.net/b_h_l/article/details/9357453

https://www.cnblogs.com/LarryGen/p/5088144.html

http://www.2cto.com/kf/201208/145066.html

打赏