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 "", 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)
in
----> 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'
标签:bytearray,abc,Python,bytes,world,x00,Out
来源: https://www.cnblogs.com/zh-dream/p/13423873.html