bytes和bytearray
Python提供了两种字节序列:不可变的 bytes 和 可变的 bytearray
字符串是字符组成的有序序列,在内存和磁盘中,所有的对象都是以二进制数字(0和1)表示的。因为这些数字每8个为1组组成一个字节,所以1字节的只能表示最多256个不同的值。
Python中的bytes只支持ASCII码标准中的128个字符,其余的128个必须用转移序列表示。
当超过1字节后,直接将Unicode码点表示成对应的二进制数字会存在问题:
1、字节顺序问题
2、浪费空间
编码和解码
字符串按照不同的字符集进行编码encode,返回字节序列bytes
语法:encode(encoding='utf-8',errors='strict') -> bytes
In [106]: 'hello world!'.encode(encoding='utf-8') Out[106]: b'hello world!'
In [115]: '啊'.encode(encoding='gbk') Out[115]: b'\xb0\xa1' In [116]: '啊'.encode(encoding='utf8') Out[116]: b'\xe5\x95\x8a'
字节序列按照不同的字符集解码decode,返回字符串
语法:
bytes.decode(encoding="utf-8", errors="strict") -> str
In [107]: b'hello world!'.decode() Out[107]: 'hello world!'
bytearray.decode(encoding="utf-8", errors="strict") -> str
In [111]: bytearray(b'hello world!').decode() Out[111]: 'hello world!'
bytes定义
定义空bytes
In [118]: bytes() Out[118]: b''
定义指定字节的bytes,被0填充
In [120]: bytes(1) Out[120]: b'\x00' In [121]: bytes(10) Out[121]: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
定义由数字 [0,255] 组成的bytes
bytes(iterable_of_ints) -> bytes
In [124]: bytes([1,2]) Out[124]: b'\x01\x02' In [125]: bytes((1,2)) Out[125]: b'\x01\x02' In [127]: bytes(range(256)) Out[127]: b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff'
bytes(string, encoding[ ,errors]) -> bytes 等价于string.encode()
In [131]: bytes('hello world','utf8') Out[131]: b'hello world' In [132]: 'hello world'.encode() Out[132]: b'hello world'
从一个字节序列或者buffer中拷贝出一个新的不可变bytes对象
bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
In [134]: b1='hello world'.encode() In [135]: b2=bytes(b1) In [136]: b2 Out[136]: b'hello world'
使用b前缀定义
只允许使用基本ASCII码
In [137]: a=b'python' In [138]: a Out[138]: b'python'
In [139]: a=b'python啊' File "<ipython-input-139-e153cec84fbf>", line 1 a=b'python啊' ^ SyntaxError: bytes can only contain ASCII literal characters.
bytes的方法
bytes的方法和str类似,只不过bytes的方法输入是bytes,输出也是bytes
In [140]: b'abc'.find(b'a') Out[140]: 0 In [141]: b'abc'.find(b'b') Out[141]: 1 In [142]: b'abc'.rfind(b'b') Out[142]: 1 In [143]: b'abc'.index(b'b') Out[143]: 1 In [144]: b'abc'.index(b'c') Out[144]: 2 In [145]: b'abc'.replace(b'c',b'd') Out[145]: b'abd' In [148]: b'abc'.split() Out[148]: [b'abc'] In [149]: b'abc'.split(b'b') Out[149]: [b'a', b'c']
类方法fromhex(string)
string必须是2个字符的16进制形式,其中空格会被忽略
In [2]: bytes.fromhex('61 09 0a 0d ') Out[2]: b'a\t\n\r'
hex()
返回16进制表示的字符串
In [6]: '\t\n\razAZ'.encode().hex() Out[6]: '090a0d617a415a'
索引访问
返回字节序列中索引元素对应的值,int类型
In [7]: b'a\t\n\r'[1] Out[7]: 9 In [8]: b'a\t\n\r'[0] Out[8]: 97
bytearray的定义
定义空bytearray
In [9]: bytearray() Out[9]: bytearray(b'')
定义指定字节的bytearray
语法:bytearray(int) 被0填充
In [11]: bytearray(9) Out[11]: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00')
使用可迭代对象([0,255]int组成)定义bytearray
语法:bytearray(iterable_of_ints) -> bytearray
In [12]: bytearray(range(3)) Out[12]: bytearray(b'\x00\x01\x02') In [13]: bytearray(['a','b','c']) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-13-8eeaf232eea3> in <module> ----> 1 bytearray(['a','b','c']) TypeError: an integer is required
定义字符串对应的bytearray
In [15]: bytearray('abc','utf8') Out[15]: bytearray(b'abc')
从字节序列或buffer中复制出一个可变的bytearray对象
In [16]: bytearray(b'a') Out[16]: bytearray(b'a')
bytearray的方法
In [17]: bytearray(b'abc').find(b'b') Out[17]: 1 In [18]: bytearray(b'abc').find(b'a') Out[18]: 0 In [19]: bytearray(b'abc').replace(b'a',b'd') Out[19]: bytearray(b'dbc') In [21]: bytearray(b'abc').replace(b'a',bytes([1,2])) Out[21]: bytearray(b'\x01\x02bc') In [22]: bytearray(b'abc').index(b'a') Out[22]: 0 In [23]: bytearray(b'abc').index(b'c') Out[23]: 2 In [24]: bytearray(b'abc').split(b'b') Out[24]: [bytearray(b'a'), bytearray(b'c')]
In [34]: a= bytearray() In [35]: a.append(1) In [36]: a Out[36]: bytearray(b'\x01') In [37]: a.append(10) In [38]: a Out[38]: bytearray(b'\x01\n') In [39]: a.insert(10,0) In [40]: a Out[40]: bytearray(b'\x01\n\x00') In [41]: a.insert(0,10) In [42]: a Out[42]: bytearray(b'\n\x01\n\x00')
类方法fromhex(string)
In [28]: bytearray.fromhex('09') Out[28]: bytearray(b'\t') In [29]: bytearray.fromhex('0a') Out[29]: bytearray(b'\n')
hex()
In [33]: bytearray('a\t'.encode()).hex() Out[33]: '6109'