字节类型

python中使用字节类型(bytes)来表示二进制信息,它是由单个字节构成的不可变序列。

字节类型的字面量的语法与字符串大致相同,只是添加了一个前缀 b

字节类型的字面量中只允许 ASCII字符。

任何超过 127的二进制值使用前缀 \x和十六进制来表示。

编码与解码

字符串转换为对应的编码称为编码,根据字符编码转换为字符叫解码。

字符串方法 .encode()可以将字符串转换为对应的编码的 bytes对象。

>>> res = 'abc123'.encode('ascii')
>>> res
b'abc123'
>>> type(res)
bytes

因为都是ascii码字符,使用本身字面量来表示,所以看起来和字符串没有什么区别,除了多了一个前缀 b

>>> res = '中'.encode('gbk')
>>> res
b'\xd6\xd0'
>>> len(res)
2

中字在 gbk中的编码为 54992,二进制表示为:

>>> bin(54992)
'0b1101011011010000'

总共16位,需要两个字节来表示,按照16进制表示第一个字节为:

>>> hex(0b11010110)
'0xd6'

第二个字节为:

>>> hex(0b11010000)
'0xd0'

换成 \x前缀后为:

'\xd6\xd0'

是不是跟上面的结果一样。

>>> res = '中'.encode('utf-8')
b'\xe4\xb8\xad'

utf-8码,三个字节表示一个汉字。

bytes对象方法 .decode()可以将字节对象转换为对应编码的字符串对象。

>>> b'\xd6\xd0'.decode('gbk')
'中'

注意:不是所有的二进制信息都可以解码为字符,只有以字符编码组织的二进制信息才可以解码为字符。当二进制信息不是以字符编码组织的,或者使用错误的字符编码进行解码会抛出异常。

>>> b'\xd6\xd0'.decode('utf-8')
Traceback (most recent call last):
  File "", line 1, in
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte

注意:为了解决字符串不一致的问题,python3中,所有的字符串在内存中都是以 unicode来表示的,其它的编码再通过 uniocde进行转换。

>>> '中'.encode('unicode_escape')
b'\\u4e2d'                  # unicode
>>> b'\\u4e2d'.decode()
>>> b'\\u4e2d'.decode('unicode_escape')
'中'

Original: https://www.cnblogs.com/superwuchaofan/p/16646201.html
Author: python心蓝
Title: 字节类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/601842/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球