Python内置数据结构----bytes和bytearray

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'

 

上一篇:恢复git reset --hard origin/master操作后丢失的代码


下一篇:序列化和反序列化