计算机只能识别010101010这种二进制数据,
这种数据让我们来读就比较难了,如果我告诉你上面的数字其实对应的就是下面的内容,是否就很容易看懂了呢。
如何将这两种内容相互转换呢?这就涉及到进制数与编码的知识了。
首先看十进制的数字是怎样转换成二进制数字的。
>>> bin(3)
'0b11'
>>> bin(10)
'0b1010'
八进制和十六进制也有对应的方法。
>>> oct(8)
'0o10'
>>> oct(12)
'0o14'
>>> hex(10)
'0xa'
>>> hex(17)
'0x11'
那二进制,八进制或者十六进制又怎么变回十进制呢?一个int全搞定。
>>> int('11',2)
3
>>> int('1010',2)
10
>>> int('10',8)
8
>>> int('14',8)
12
>>> int('a',16)
10
>>> int('11',16)
17
进制之间有相互转换呢?
可以统一先到十进制,然后从十进制过渡到对应的进制数。
在 python 中有一个 ord 方法,可以将任意字符转换成 unicode code。通俗点说就是一个数字。不过这个数字和字符是一一对应的。
>>> help(ord)
Help on built-in function ord in module builtins:
ord(c, /)
Return the Unicode code point for a one-character string.
与ord 相对应的还有一个chr方法,可以将一个数字变成字符。
>>> help(chr)
Help on built-in function chr in module builtins:
chr(i, /)
Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.
比如字母A 可以通过 ord('A') 获取其对应的十进制数65,小写的a就是 97。
>>> ord('A')
65
>>> ord('a')
97
有了十进制数,我们就可以通过bin将其转换成二进制数了。
>>> ord('a')
97
>>> bin(ord('a'))
'0b1100001'
>>> ord('1')
49
>>> bin(ord('1'))
'0b110001'
中文文字又该怎样处理呢?同样可以使用 ord
>>> ord('中')
20013
>>> bin(20013)
'0b100111000101101'
那二进制数又怎样回到我们可以看的动的文本呢?通过chr方法,传入对应的十进制数字即可。
>>> chr(20013)
'中'
>>> chr(65)
'A'
单个字符都非常好处理,那要是一句话或者一篇文章呢?
很容易想到的就是循环遍历,一个个字符处理即可。
>>> for i in 'hello 中国':
print(bin(ord(i)))
0b1101000
0b1100101
0b1101100
0b1101100
0b1101111
0b100000
0b100111000101101
0b101011011111101
一行输出。
>>> for i in 'hello 中国':
print(bin(ord(i)),end='')
0b11010000b11001010b11011000b11011000b11011110b1000000b1001110001011010b101011011111101
也可以通过replace方法删除掉开头的0b二进制标识符。
>>> for i in 'hello 中国':
print(bin(ord(i)).replace('0b',''),end='')
11010001100101110110011011001101111100000100111000101101101011011111101
那如果要将这一串数字变回原本的文字,该如何做呢?
11010001100101110110011011001101111100000100111000101101101011011111101
这个好像有点难了,难点主要是因为每个字符它的位数是不定的。怎样知道哪些数字表示一个字符呢?
要不采取空格分隔,要不就让每个字符的二进制数是等长度。
根据上面的原理,我们实现文章开头所讲的两种内容相互转换。
你是不是还听过 ASCII, GBK,GB18030,Unicode,UTF-8,encode,decode, base64 等各种名词了,感兴趣的可以根据关键词去看看更详细的编码解码知识。