bytes、bytearray

Python3引入两个新类型:

    bytes

    不可变字节序列

    bytearray

    字节数组

    可变


字符串与bytes

    字符串是字符组成的有序序列,字符可以使用编码来理解;

    bytes是字节组成的有序的不可变序列;

    bytearray是字节组成的有序的可变序列;

编码与解码

    字符串按照不同的字符集编码encode返回字节序列bytes

        S.encode(encoding='utf-8', errors='strict') -> bytes

    字节序列按照不同的字符集解码decode返回字符串

        bytes.decode(encoding='utf-8', errors='strict') -> str

        bytearray.decode(encoding='utf-8', errors='strict') -> str


bytes定义:

bytes()    空bytes
bytes(int)    指定字节的bytes,被0填充
bytes(iterable_of_ints) -> bytes    [0,255]的int组成的可迭代对象
bytes(string,encoding[,errors]) -> bytes     等价于string.encode()
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
从一个字节序列或者buffer复制出一个新的不可变的bytes对象

使用b前缀定义
    只允许基本ASCII使用字符形式b'abc9'
    使用16进制表示b'\x41\x61'

bytes操作:

和str类型类似,都是不可变类型,所以方法很多都一样。只不过bytes方法,输入是bytes,输出是bytes
    In [1]: b'abcdef'.replace(b'f',b'k')
    Out[1]: b'abcdek'
    
    In [2]: b'abc'.find(b'b')
    Out[2]: 1
    
    
类方法bytes.fromhex(string):
    string必须是2个字符的16进制的形式,‘6162 6a 6b’,空格将被忽略
        In [3]: bytes.fromhex('6162 09 6a 6b00')
        Out[3]: b'ab\tjk\x00'
        
   
hex()
    返回16进制表示的字符串
    In [4]: 'abc'.encode().hex()
    Out[4]: '616263'
    
索引
    In [6]: b'abcdef'[2]
    Out[6]: 99
    返回该字节对应的数,int类型


bytearray定义

bytearray()    空bytearray
bytearray(int)    指定字节的bytearray,被0填充
bytearray(iterable_of_ints) -> bytearray    [0,255]的int组成的可迭代对象
bytearray(string,encoding[,errors]) -->bytearray    近似string.encode(),不过返回可变对象
bytearray(bytes_or_buffer)    从一个字节序列或者buffer复制出一个新的可变的bytearray对象

注意 ,b前缀定义的类型是bytes类型

bytearray操作

和bytes类型的方法相同
    In [1]: bytearray(b'abcdef').replace(b'f',b'k')
    Out[1]: bytearray(b'abcdek')
    
    In [2]: bytearray(b'abc').find(b'b')
    Out[2]: 1
    
类方法bytearray.fromhex(string)
    string必须是2个字符的16进制的形式,'6162 6a 6b',空格将被忽略
    In [3]: bytearray.fromhex('6162 09 6a 6b00')
    Out[3]: bytearray(b'ab\tjk\x00')
    
hex()
    返回16进制表示的字符串
    In [5]: bytearray('abc'.encode()).hex()
    Out[5]: '616263'
    
索引
    In [6]: bytearray(b'abcdef')[2]
    Out[6]: 99
    返回该字节对应的数,int类型

操作:

append(int)尾部追加一个元素
insert(index,int)在指定索引位置插入元素
extend(iterable_of_ints)将一个可迭代的整数集合追加到当前bytearray
pop(index=-1)从指定索引上移除元素,默认从尾部移除
remove(value)找到第一个value移除,找不到抛ValueError异常

注意,上述方法若需要使用int类型,值在[0,255]

clear()清空bytearray
reverse()翻转bytearray,就地修改

举例:

In [1]: b = bytearray()

In [2]: b.append(97)

In [3]: b.append(99)

In [4]: b
Out[4]: bytearray(b'ac')

In [5]: b.insert(1,98)

In [6]: b
Out[6]: bytearray(b'abc')

In [7]: b.extend([65,66,67])

In [8]: b
Out[8]: bytearray(b'abcABC')

In [9]: b.remove(66)

In [10]: b
Out[10]: bytearray(b'abcAC')

In [11]: b.pop()
Out[11]: 67

In [12]: b.reverse()

In [13]: b
Out[13]: bytearray(b'Acba')

In [14]: b.clear()

In [15]: b
Out[15]: bytearray(b'')