编码与解码

二进制、八进制、十六进制

简单地说,就是逢二进一,逢八进一,逢十六进一。 识别方式

二进制数据最好识别,除了0就是1的就是。

八进制通常在开头加0b 作为标志。

1
2
3
python
>bin(16)
0b10000

八进制数据(base‐8),包括0‐7。

八进制通常在开头加0 作为标志。 例如: 16(十进制)的八进制为20。写出来就是020 用python转换: print oct(16)

十六进制(base‐16),包括0‐9,A‐F,不区分大小写。

它的标志是0x

例如:44(十进制)的十六进制为2c,写出来就是0x2c

用python,十进制转十六进制: print hex(44)

用shell命令,字符串转十六进制: echo data xxd ‐p

十六进制转字符串: echo data | xxd ‐r ‐p

Base‐36

包括0‐9,A‐Z。不区分大小写,字母要么全部都是大写,要么全部都是小写,A=a。 base36很少用,不然在python中也会像上面的进制转换一样,直接用一个函数就能转换了。 首先需要安装base36模块,然后

1
2
3
4
>>>import base36
>>> import base36
>>> assert base36.dumps(19930503) == 'bv6h3'
>>> assert base36.loads('bv6h3') == 19930503

Base‐64

包括A‐Z、a‐z、0‐9、+、/(26*2+10+2=64) base64经常用在网络传输中。因为网络协议们是有着很久远的历史,支持的字符很少,安全性也是完全没有考虑过的事情。 为了传送一些不支持的字符,就编码一下。

a的ascii码是97,97的二进制是1100001 b的ascii码是98,98的二进制是1100010 所以ab的二进制就是1100001 1100010 把这串二进制以6位分组,就是11000 011100 010 然后再转换为十进制,11000的十进制是24,24再转换为ascii码。 末尾特殊规定:最后010 的二进制是2,但是2的ascii码不在A‐Z,a‐z,0‐9那些64字符中,最小的A的ASCII码为65。 所以,010干脆用=代替,只要最后一位很小,不能用ascii码表示的,就用=表示。 base64的特征有末尾的==(经常有,但也可能没有=)。 在linux环境,经常用

1
echo '需要解码的base64数据' | base64 ‐d

URL编码

通常出现在url地址上,方便传输(空格等字符不方便传输)。 包括%和十六进制数。 特征:就是%,当你看到如下字符,就能立即反应过来这是url编码的字符。每个字符由三位组成,%和两位十六进制数,这个十六进制数是某个ASCII码转换而成的。

1
%E6%96%87%E7%AB%A0/%E5%8D%9A%E5%AE%A2%E5%A4%87%E4%BB%BD/%E5%A4%87%E4%BB%BD/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%9E%E9%AA%

python编码 解码 print urllib.unquote('%D6%D0%CE%C4')

HTML实体编码

在html(超文本传输协议)中,有些字符用编程的术语来说就是“标识符”。标识符是预定义的,而我们写代码的时候不能把变量名起名为标识符。所以 html编码就是把“标识符”用“实体”代替。 html实体编码的特征:包括& ; 和英文小写字母字符。 特征: <>

ASCII

美国信息交换标准码 Unicode是ASCII码的扩展,用2个字节,宽字符集。 php escape() 函数 可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。 _escape函数括号里的字符串是_必需的,是要被转义或编码的字符串

该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码:* @ - _ + . /。其他所有的字符都会被转义序列替换。 2883590-690f8ccc594eb48c

utf‐8 编码与unicode

例子

1
11100100 10111000 10100101

utf-8又叫做8‐bit Unicode Transformation Format,直译就是可变长度的unicode。 ascii码是美国人发明的,只包括英文字符和一些符号,无法表达其他国家的文字。 unicode是为了解决其他国家的字符问题。可想而知,全世界有上百个国家,而一个国家至少有1套字符,所以unicode需要用更长的01101101数据,来代表一个字符。

那么问题来了,如果一个英文文本,如果是unicode格式,那么在网络上传输的话,比ASCII格式的长度要大很多! 有人又说了,那么我转换为ASCII码格式不就行了嘛?

但是,如果是中英文混合呢?比如说一篇医学技术论文,中文里夹杂英文专业术语?如果转为ASCII码,那中文不就乱码了吗?

为了解决这个传输问题。utf-8编码出现了,如果是ASCII码里的,就用ASCII码里的,如果不是,就用unicode里的。可以简单理解为(ASCII+unicode)等于utf-8

?中文与utf-8编码的关系。

(ASCII+unicode)约等于utf-8 中文字符是unicode的子集。所以可以说,中文可以用utf-8表示。 ?unicode转utf-8

1
2
3
4
python
a='Metasploit\u6e17\u900f\u5b9e\u4f8b\u8bb2\u89e3' str类型
b=a.decode('unicode_escape') unicode类型,在linux中,可以用print直接输出中文
c=b.encode('utf-8') utf-8类型,在python中,即str类型

unicode只有转换为str(utf-8)才能用url编码传输。

?中文转为URL编码

1 在linux中,中文都是utf-8编码的。用quote()函数即可完成转换。

  • ?URL编码转为u ‐8 如果要显示为中文,用print函数直接输出即可。 print urllib.unquote(b) 2

gbk与utf-8

在unicode出现之前,各个国家都有自己的编码方式,gbk就是中文的编码方式(话说中国和台湾用的不是同一种编码,悄声说) windows的中文就是用的gbk编码,而linux的中文用的就是utf-8编码,所以文本复制时候,可能会乱码。 linux命令,gbk转utf‐8;如果转回来,gbk和utf‐8交换位置即可。 xx.txt是gbk格式文档,final是成功转换的utf‐8文档。 iconv ‐f gbk ‐t utf‐8 xx.txt > final.txt