字符概要

Python 3引入的不可变bytes类型和Python 2.6添加的可变bytearray类型

bytes和bytesarray对象的各个元素是介于0-255(含)之间的整数,而不像Python 2 的str对象那样是单个的字符。然而,二进制序列的切片始终是同一种类型的二进制序列,包含长度为1的切片

cafe=bytes('café',encoding='utf_8') # bytes对象可以从str对象使用给定的编码构造
cafe
b'caf\xc3\xa9'
cafe[0] # 各个元素是range(256)内的整数
99
cafe[:1] # bytes对象的切片还是bytes对象,即使是只有一个字节的切片
b'c'
cafe_arr=bytearray(cafe)
cafe_arr # bytearray对象没有字面量句法,而是以bytearray()和字节序列字面量参数的形式显示
bytearray(b'caf\xc3\xa9')
cafe_arr[-1:] # bytearray对象的切片还是bytearray对象
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对象

import array 
numbers=array.array('h',[-2,-1,0,1,2]) # 指定类型代码h,创建一个短整数(16位)数组
octets=bytes(numbers) # octets保存组成numbers的字节序列的副本
octets # 表示5个短整数的10个字节
b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'

使用缓冲类对象创建bytes或bytearray对象时,始终复制源对象中的字节序列。与之相反,memoryview对象允许在二进制数据结构之间共享内存。如果想从二进制序列中提取结构化信息,struct模块是重要的工具

结构体和内存视图

struct模块提供了一些函数,把打包的的字节序列转换成不同类型字段组成的元组,还有一些函数用于执行反向转换,把元组转换成打包的字节序列。struct模块能处理bytes、bytearray和memoryview对象

memoryview类不是用于创建或存储字节序列,而是共享内存,让你访问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列

# 使用memoryview和struct查看一个GIF图像的首部
import struct 
fmt='<3s3sHH' # 结构体的格式:<是小字节序,3s3s是两个3字节序列,HH是两个16位二进制数
with open('filter.gif','rb') as fp:
    img=memoryview(fp.read()) # 使用内存中的文件内容创建一个memoryview对象
    
header=img[:10] # 使用memoryview对象的切片再创建一个memoryview对象,这里不会复制字节序列
bytes(header) # 转换成字节序列
 
struct.unpack(fmt,header) # 拆包memoryview对象,得到一个元组,包含类型、版本宽度和高度
 
del  header # 删除引用,释放memoryview实例所占的内存
def img

memoryview对象的切片是一个新memoryview对象,而且不会复制字节序列。

上一篇:.NET CORE(C#) WPF 重新设计Instagram


下一篇:PPTP + FreeRADIUS + MySQL 安装与配置