一直没怎么搞清楚Python中的二进制,今天网上收集了一些资料,并做了个小测试来加深自己对Python中二进制的认识。
1、二进制表示方法
通常二进制数据是通b
开头,后面跟着双引号或者单引号括起来的内容表示,其中括起来的内容可以是ASCII码中的字符,也可以如\0xe4
格式的十六进制组成的内容,如:
>>>b'abc' #由ASCII码字符表示的二进制
b'abc'
>>>b'\xe3\xf4abd' #由ASCII码字符和类似\x**格式组合表示的二进制
b'\xe3\xf4abd'
2、 二进制的本质
我们通过for
循环查看一下二进制数据中到底是什么:
>>>for i in b'abc': #单个字节循环
print(i)
#结果
97
98
99
由于ASCII
编码为97
对应的字符为a
,98
为b
,99
为c
,所以b'abc'
本质为'abc'
中3
字符对应的ASCII
编码,我们将字符转换成由0、1
表达的二进制:
>>>for i in b'abc':
print(bin(i).end=" ")
0b1100001 0b1100010 0b1100011
所以b'abc'
二进制本质就是表示3个字节,3个字节具体的内容为01100001
01100010
01100011
。
但是当一个字节(8个bits)确定后,不一定能在ASCII码表中找到对应的字符,如11100100
,此时可采用十六进制\xe4来表示(十六进制中:e→1110
,4→0100
)。
另外,b'abc'
同样也可以通过b'\x61\x62\x63'
表示(\x61→97→a
,\x62→98→b
,\x63→99→c
),只是前者表述更加简单直观。
>>>b'\x61\x62\x63'
b'abc'
所以python中,二进制数据本质是字节数据,每个字节由8个bit
组成,采用ASCII码中的字符(能找到时)或者十六进制格式(找不到时)或者其组合格式来表示的主要目的是使得二进制表达更加简化和直观(b'a'
比01100001
直观、简单;\xe4
比11100100
直观、简单)。
3 、非ASCII码字符如何表示成二进制
ASCII表中字符,其二进制可直接采用类似b'abc'
表达,但是非ASCII码
字符如“中”该怎么表示成二进制呢?直接b’中’可行吗?
>>> b'中'
SyntaxError: bytes can only contain ASCII literal characters.
直接报错……
这里就牵涉到编码的问题了,也就是非ASCII码
字符需要按照一定的编码方案进行编码,编码
过程就是将字符转化为二进制的过程,反过来就是解码
,将二进制转化为字符或字符串的过程。
我们按utf-8
编码方式进行演示。
>>>'中'.encode(encoding='utf-8')
b'\xe4\xb8\xad' #3个字节
>>>for i in b'\xe4\xb8\xad':
print(bin(i),end="")
0b111001000b101110000b101011010b1101100b110110
所以’中’字符按照utf-8
编码方式转化为二进制为0b111001000b101110000b101011010b1101100b110110
。