认识二进制序列类型
计算机采用二进制数来存储数据,在计算机的存储器中,以8位二进制位作为一个存储单元,也称为一个字节,英文名称是byte。对于一个有128个存储单元的存储器,可以说它的存储容量为128字节。

二进制数不便于阅读和书写,人们一般采用十六进制来表示二进制数。十六进制的基数是16,数码为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。
由于十六进制的基数是2的幂,所以这两种数制之间的转换是十分容易的。一个二进制数,只要把它从低位到高位每4位组成一组,直接用十六进制数来表示就可了。

在计算机编程语言中,通常用数字后面跟一个英文字母来表示该数的数制。十进制一般用D(Decimal)、二进制数用B(Binary)、十六进制用H(Hexadecimal)来表示。例如:23AH、570D、110101B、0075H,…。当然也可以用这些字母的小写形式。
二进制序列类型的每个元素是一个字节(byte),二进制序列的核心类型是bytes,和bytearray。
bytes对象
bytes对象是不可变序列,不支持序列对象元素的更新操作,支持序列对象的通用访问操作。
bytes对象实际上是不可变的整数序列,整数范围被限制在0至256,该范围是一个字节所能表示的整数大小。ASCII文本编码的范围也是0至256,因此可以使用ASCII字符来创建bytes对象。
Python的内置函数Bytes可以创建Bytes对象,Bytes函数声明如下:
bytes([source[, encoding[, errors]]])
参数source、encoding、errors都是可选的。调用函数时,如果没有给出任何参数,函数会返回一个空的bytes对象。
source可以是字符串值,不过要在字符串值前面加一个前缀b。例如: b”Hello”、b‘Hello’、b'''Hello'''。
案例代码:
>>> s = bytes(b"Hello")
>>> print(s)
b'Hello'
>>> s = bytes(b'Hello')
>>> s = bytes(b'''Hello''')
source可以是一个整数,创建一个用零值填充的bytes对象。
案例代码:
>>> s = bytes(10)
>>> print(s)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>>
案例代码的\x表示后面的数字是十六进制。
source可以是一个使用range函数创建的整数序列,该整数序列应该在0至256范围内。
案例代码:
>>> s = bytes(range(20))
>>> print(s)
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13'
>>>
source可以是一个bytes对象,函数会复制现有的bytes对象。
案例代码:
>>> s = bytes(b'Hello')
>>> t = bytes(s)
>>> print(t)
b'Hello'
>>>
一个字节正好对应两个十六进制数字,因此十六进制数是描述二进制数据的常用格式。bytes类型也提供了读取十六进制数据的静态方法,静态方法可以直接通过类型名称调用,不需要使用对象名称调用。
注释
(1)fromhex(string)是bytes类型的静态方法,静态方法可以直接通过类型名称调用,该方法返回bytes对象。方法的参数str必须是每个字节由两个十六进制数构成,其中的 ASCII 空白符会被忽略。
案例代码:
>>> s = bytes.fromhex('2E55 3Ef2 ')
>>> print(s)
b'.U>\xf2'
>>> type(s)
<class 'bytes'>
>>>
案例中字符串内容是十六进数字的ASCII编码,其中十六进数f2没有对应的ASCII字符,因此输出时会显示原十六进数字。
(2)hex([sep[, bytes_per_sep]]) 是bytes类型的方法,该方法返回字符串对象,该字符串对象包含bytes对象中每个字节的两个十六进制数字。
参数sep是每个字节之间的分隔字符,它是一个可选参数。如果给出sep,输出的每个字节之间会使用sep分隔字符进行分隔。可选的 bytes_per_sep 参数控制间隔几个字符进行分隔, 正值会从右开始计算分隔符的位置,负值则是从左开始。
案例代码:
>>> s = bytes(b"Hello")
>>> s.hex("-")
'48-65-6c-6c-6f'
>>> s.hex("-",2)
'48-656c-6c6f'
>>> s.hex("-",3)
'4865-6c6c6f'
>>> s.hex("-",-2)
'4865-6c6c-6f'
>>>
bytearray对象
bytearray对象是bytes 对象的可变序列版本。由于 bytearray 对象是可变的,该对象支持可变序列所有的通用操作。
bytes类型的所有方法,bytearray对象都支持。
Python的内置函数bytearray可以创建一个bytearray对象,创建方法同bytes相同。
案例代码:
>>> b = bytearray(b"Hello")
>>> print(b)
bytearray(b'Hello')
>>> b = bytearray(10)
>>> print(b)
bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> b = bytearray(range(60,100))
>>> print(b)
bytearray(b'<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abc')
>>>
可以使用Python的内置函数list将bytearray对象转换为列表。
案例代码:
>>> b = bytearray(range(60,100))
>>> s = list(b)
>>> print(s)
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99]
>>>
bytes和bytearray类型的方法
bytes 和 bytearray 提供了处理二进制数据的方法,这些方法同字符串类型处理字符串的方法基本相同。bytes 和 bytearray都可以调用这些方法。
下表列出了常用的方法。表中的b表示二进制序列对象(bytes和bytearray)。

注释
(1)decode(encoding="utf-8", errors="strict")是bytes 和bytearray类型的方法。该方法返回从给定 bytes 解码出来的字符串。 默认编码为 'utf-8'。参数encoding设置bytes的编码方式。
案例代码:
>>> b = bytes(range(45,50))
>>> print(b)
b'-./01'
>>> s = b.decode()
>>> print(s)
-./01
>>> type(s)
<class 'str'>
>>>
上机操作
1、创建一个bytearray对象,对象的值为b“TypeError: sequence item 0: expected str instance, int found”,完成如下操作:
(1) 查找字节序列“item”;
(2) 查找字节序列“te”出现的次数;
(3) 使用”:”分隔bytearray对象;
(4) 使用“*”替换bytearray对象内的空格。