Python 之 bytes/bytearray 的深入浅出
1、前言
1.1 Python3 引入两个新类型
bytes
: 不可变字节序列bytearray
: 可变的字节数组
1.2 ASCII
- ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准
- ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符
- 32~126(共95个)是字符(32是空格)
- 48~57为0到9十个阿拉伯数字
- 65~90为26个大写英文字母
- 97~122号为26个小写英文字母
'\t\n\r'.encode().hex() # '090a0d'
1.3 字符串与bytes bytearray
- 字符串是字符组成的有序序列,字符可以使用编码来理解
bytes
是字节组成的有序的不可变序列bytearray
是字节组成的有序的可变序列
1.4 编码与解码
-
字符串按照不同的字符集编码
encode
返回字节序列bytes
bytes('abc', encoding='utf-8', errors='strict') # b'abc' '123'.encode(encoding='utf-8', errors='strict') # b'123' bytearray('abc', encoding='utf-8', errors='strict') # bytearray(b'abc')
-
字节序列按照不同的字符集解码
decode
返回值字符串b'123'.decode(encoding='utf-8', errors='strict') # '123' bytearray(b'abc').decode(encoding='utf-8', errors='strict') # 'abc'
-
示例
'中国2021加油'.encode(encoding='utf-8') # b'\xe4\xb8\xad\xe5\x9b\xbd2021\xe5\x8a\xa0\xe6\xb2\xb9' '中国2021加油'.encode(encoding='utf-8').hex() # 'e4b8ade59bbd32303231e58aa0e6b2b9' '中国2021加油'.encode(encoding='gbk') # b'\xd6\xd0\xb9\xfa2021\xbc\xd3\xd3\xcd' a = b'\xe4\xb8\xad\xe5\x9b\xbd2021\xe5\x8a\xa0\xe6\xb2\xb9' a.decode(encoding='utf-8') # '中国2021加油' a.decode(encoding='gbk') # UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: illegal multibyte sequence
b = 'a\tb\t\tc\n\rd' print(b) # 普通打印,无法看出空格,可以使用编码后查看 # a b c # d print(b.encode()) # b'a\tb\t\tc\n\rd' print(b.encode().hex()) # 6109620909630a0d64 print(bytes.fromhex(b.encode().hex())) # b'a\tb\t\tc\n\rd'
b = '中国' print(b) # 中国 print(b.encode()) # b'\xe4\xb8\xad\xe5\x9b\xbd' print(b.encode().hex()) # e4b8ade59bbd print(bytes.fromhex(b.encode().hex())) # b'\xe4\xb8\xad\xe5\x9b\xbd' print(bytes.fromhex(b.encode().hex()).decode()) # 中国