bytes()函数和bytes对象(byte string)

2019年10月24日 / 25次阅读 / Last Modified 2019年10月24日
内置函数

bytes()函数是python的一个内置函数,用此函数可以创建不可变的(immutable)bytes对象(bytes对象,可以理解为byte string)。

bytes对象与普通string对象的区别:
bytes对象是由byte by byte组成的string,它的len或slice操作,都是以byte为基础;普通string对象的内容在python中是unicode编码,对应底层两个字节,len的结果是字符数量,而不是字节byte数量,slice操作也是以字符为边界。相同的是,byte string和普通string都是immutable变量。

由可迭代对象创建bytes

>>> bytes([1,2,3,4,5])
b'\x01\x02\x03\x04\x05'
>>> bytes((1,2,3,4,5))
b'\x01\x02\x03\x04\x05'
>>> bytes(b'12345')
b'12345'

由于每一个byte的值只能是0到255,因此在创建bytes对象的时候,输入的某个int值如果大于255,就会出错:

>>> bytes([123])
b'{'
>>> bytes([1234])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: bytes must be in range(0, 256)
>>> bytes(range(256))
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'

相比大家已经看出来了,b开始的字符串表达式,就是一个bytes对象

需要特别注意,可迭代对象中的int值,在转换成bytes对象的值的时候,这个值是16进制值,而不是一个自然数字。

普通string转换到bytes

在bytes()函数中指明编码方式,就可以直接由string得到bytes:

>>> bytes('12345', 'utf-8')
b'12345'
>>> bytes('www.pynote.net', 'utf-8')
b'www.pynote.net'
>>> bytes('麦新杰', 'utf-8')
b'\xe9\xba\xa6\xe6\x96\xb0\xe6\x9d\xb0'
>>> bytes('麦新杰', 'utf-8').decode()
'麦新杰'

大家应该都统一到UTF-8编码了吧!

bytes对象decode,就有回到了string对象。

bytes(int)

如果bytes()函数只有一个int参数,表示创建一个有int个NULL为值(0x00)的bytes对象:

>>> bytes(2)
b'\x00\x00'
>>> bytes(6)
b'\x00\x00\x00\x00\x00\x00'

由于得到的bytes对象不可更改,这个功能可能只能在某些拼接byte string的时候用得上。

直接调用bytes()

>>> bytes()
b''

直接无参数使用bytes(),得到一个空的bytes对象。

直观地理解不可修改(immutable)特性

此文主要介绍bytes,这里简单提一下immutable:

>>> a = bytes([1,2,3,4,5])
>>> a
b'\x01\x02\x03\x04\x05'
>>> a[0] = 56
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
>>> b = bytearray([1,2,3,4,5])
>>> b
bytearray(b'\x01\x02\x03\x04\x05')
>>> b[0] = 56
>>> b
bytearray(b'8\x02\x03\x04\x05')

我们想修改a[0]的值,出错了,因为这个bytes不可修改。但是bytearray对象就是可修改的(mutable),就可以直接对b[0]进行赋值操作。

bytes对象的字符串特性

>>> a = bytes([1,2,3,4,5,6,7,8])
>>> len(a)
8
>>> a[2:]
b'\x03\x04\x05\x06\x07\x08'
>>> a[5:7]
b'\x06\x07'
>>> a[7]
8
>>> a.find(b'5')
-1
>>> a.find(b'\x05')
4

单独取bytes的一个字符,就是一个0-255的数字。再次提醒创建bytes对象时的list中的1-8,不是ASCII中的数字1-8,而是0-255中的1-8。

以上就是对bytes()函数已经对应的bytes对象的介绍。

-- EOF --

本文链接:https://www.pynote.net/archives/1377

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top