python 代码转换成0101010

2022-05-22 14:57:44 浏览数 (1)

计算机只能识别010101010这种二进制数据,

这种数据让我们来读就比较难了,如果我告诉你上面的数字其实对应的就是下面的内容,是否就很容易看懂了呢。

如何将这两种内容相互转换呢?这就涉及到进制数与编码的知识了。


首先看十进制的数字是怎样转换成二进制数字的。

代码语言:javascript复制
>>> bin(3)
'0b11'
>>> bin(10)
'0b1010'

八进制和十六进制也有对应的方法。

代码语言:javascript复制
>>> oct(8)
'0o10'

>>> oct(12)
'0o14'
>>> hex(10)
'0xa'
>>> hex(17)
'0x11'

那二进制,八进制或者十六进制又怎么变回十进制呢?一个int全搞定。

代码语言:javascript复制
>>> 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。通俗点说就是一个数字。不过这个数字和字符是一一对应的。

代码语言:javascript复制
>>> 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方法,可以将一个数字变成字符。

代码语言:javascript复制
>>> 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。

代码语言:javascript复制
>>> ord('A')
65
>>> ord('a')
97

有了十进制数,我们就可以通过bin将其转换成二进制数了。

代码语言:javascript复制
>>> ord('a')
97
>>> bin(ord('a'))
'0b1100001'
>>> ord('1')
49
>>> bin(ord('1'))
'0b110001'

中文文字又该怎样处理呢?同样可以使用 ord

代码语言:javascript复制
>>> ord('中')
20013
>>> bin(20013)
'0b100111000101101'

那二进制数又怎样回到我们可以看的动的文本呢?通过chr方法,传入对应的十进制数字即可。

代码语言:javascript复制
>>> chr(20013)
'中'
>>> chr(65)
'A'

单个字符都非常好处理,那要是一句话或者一篇文章呢?

很容易想到的就是循环遍历,一个个字符处理即可。

代码语言:javascript复制
>>> for i in 'hello 中国':
    print(bin(ord(i)))
    
0b1101000
0b1100101
0b1101100
0b1101100
0b1101111
0b100000
0b100111000101101
0b101011011111101

一行输出。

代码语言:javascript复制
>>> for i in 'hello 中国':
    print(bin(ord(i)),end='')
    
0b11010000b11001010b11011000b11011000b11011110b1000000b1001110001011010b101011011111101

也可以通过replace方法删除掉开头的0b二进制标识符。

代码语言:javascript复制
>>> for i in 'hello 中国':
    print(bin(ord(i)).replace('0b',''),end='')
    
11010001100101110110011011001101111100000100111000101101101011011111101

那如果要将这一串数字变回原本的文字,该如何做呢?

代码语言:javascript复制
11010001100101110110011011001101111100000100111000101101101011011111101

这个好像有点难了,难点主要是因为每个字符它的位数是不定的。怎样知道哪些数字表示一个字符呢?

要不采取空格分隔,要不就让每个字符的二进制数是等长度。

根据上面的原理,我们实现文章开头所讲的两种内容相互转换。

你是不是还听过 ASCII, GBK,GB18030,Unicode,UTF-8,encode,decode, base64 等各种名词了,感兴趣的可以根据关键词去看看更详细的编码解码知识。

0 人点赞