Python 3引入的不可变bytes类型和Python 2.6添加的可变bytearray类型
bytes和bytesarray对象的各个元素是介于0-255(含)之间的整数,而不像Python 2 的str对象那样是单个的字符。然而,二进制序列的切片始终是同一种类型的二进制序列,包含长度为1的切片
| |
b'caf\xc3\xa9'
| |
99
| |
b'c'
| |
bytearray(b'caf\xc3\xa9')
| |
bytearray(b'\xa9')
my_bytes[0]获取的是一个整数,而my_bytes[:1]返回的是一个长度为1的bytes对象。s[0]==s[:1]只对str这个序列类型成立。对其他各个序列类型来说,s[i]返回一个元素,而s[i:i+1]返回一个类型相同的序列,里面是s[i]元素
虽然二进制序列其实是整数序列,但是它们的字面量表示法表明其中有ASCII文本。因此,各个字节的值可能会使用下列三种不同的方式显示。
- 可打印的ASCII范围内的字节(从空格到~),使用ASCII字符本身
- 制表符、换行符、回车符和\对应的字节,使用转义序列\t、\n、\r和\\
- 其他字节的值,使用十六进制转义序列(例如,\x00是空字节)
使用数组中的原始数据初始化bytes对象
| |
b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'
使用缓冲类对象创建bytes或bytearray对象时,始终复制源对象中的字节序列。与之相反,memoryview对象允许在二进制数据结构之间共享内存。如果想从二进制序列中提取结构化信息,struct模块是重要的工具
结构体和内存视图
struct模块提供了一些函数,把打包的的字节序列转换成不同类型字段组成的元组,还有一些函数用于执行反向转换,把元组转换成打包的字节序列。struct模块能处理bytes、bytearray和memoryview对象
memoryview类不是用于创建或存储字节序列,而是共享内存,让你访问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列
| |
memoryview对象的切片是一个新memoryview对象,而且不会复制字节序列。