bytearray() <Python 内置函数>

转载须注明出处:简书@Orca_J35 | GitHub@orca-j35

class bytearray([source[, encoding[, errors]]])

该内置函数本质上是 bytearray 类的构造函数,用于创建一个 bytearray 实例。bytearray 实例是一个由字节(8-bits 无符号)构成的可变序列,并拥有大多数可变序列的常见方法[详见:Mutable Sequence Types],并且还包含 bytes 类型中的大多数方法[详见: Bytes and Bytearray Operations ]

在 Python 中,我们可以通过 bytes 字面值来创建 bytes 对象,但并没有用于创建 bytearray 字面值的语法,我们只能通过调用构造函数 bytearray() 来创建 bytearray 对象。

初始化 bytearray 实例的方式如下:

  • 没有任何参数时,将创建一个空实例

    # bytearray() -> empty bytes array
    >>> bytearray()
    bytearray(b'')
    
  • source 是一个整数时,将创建一个长度为 source 且每个字节均为空的 bytearray 对象

    # bytearray(int) -> bytearray
    >>> bytearray(5)
    bytearray(b'\x00\x00\x00\x00\x00')
    
  • source 是一个由自然数构成的可迭代对象,且每个元素的值 x 均满足 0 ≤ x ≤ 255

    # bytearray(iterable_of_ints) -> bytearray
    >>> bytearray(range(5)) # 最大范围是range(256)
    bytearray(b'\x00\x01\x02\x03\x04')
    >>> bytearray([1,2,3,4,5])
    bytearray(b'\x01\x02\x03\x04\x05')
    
  • source 是一个 bytes 对象,将通过缓冲器协议(buffer protocol)复制其中的二进制数据

    # bytearray(bytes) -> mutable copy of bytes
    >>> bytearray(b'Hi!')
    bytearray(b'Hi!')
    
  • source 是一个实现了缓冲区(buffer) API 的对象时,则会使用 source 的只读缓冲区来初始化 bytearray 对象。

    # bytearray(buffer) -> mutable copy of buffer
    
  • source 是一个字符串时,必须给定 encoding 参数。此时,构造函数 bytearray() 会通过 str.encode() 方法将 source 编码(encoding)为字节序列。

    • encoding 参数用于设置编码方案,会被传递给 str.encode()。在 Standard Encodings 中可查看编码方案列表。
    • errors 参数用于设置错误处理方案,也会被传递给 str.encode()。如果 errors 为空,str.encode() 会使用默认方案 'strict'——该方案在出现编码错误时会抛出 UnicodeErrorerrors 可以是 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 或任何已通过 codecs.register_error() 注册的名称。

    Tips: 在 Python 文档中,"编码(encoding)"是指将 Unicode 字符串转换为字节序列的规则,也就是说"编码"包含了从"抽象字符序列"到"字节序列"的全部过程。

    # bytearray(string, encoding[, errors]) -> bytearray
    >>> bytearray('abcd','utf-8')
    bytearray(b'abcd')
    >>> bytearray('鲸','utf-8')
    bytearray(b'\xe9\xb2\xb8')
    
    >>> bytearray('鲸','ascii')
    Traceback (most recent call last):
      File "<pyshell#11>", line 1, in <module>
        bytearray('鲸','ascii')
    UnicodeEncodeError: 'ascii' codec can't encode character '\u9cb8' in position 0: ordinal not in range(128)
    >>> bytearray('鲸','ascii','ignore')
    bytearray(b'')
    

扩展阅读: Binary Sequence Types — bytes, bytearray, memoryviewBytearray Objects.

1. 深入理解 bytearray 对象

在 C 语言中创建字节数组的语法如下:

byte bytes_array[] = {0x02, 0x03, 0x0A, 0x41}

Python 中的 bytearray 对象与 C 语言中的字节数组类似,每个索引位置都对应一个整数 x (且 0≤x≤255)。不同之处在于 bytearray 对象会以转义序列或 ASCII 字符显示相应数值(如,将十进制整数 65 显示为字母 A),但是 bytearray 对象的每个索引位置仍然是一个数值,而非一个字符。bytearray 对象是一个实实在在的字节序列,每个索引位置对应一个字节(byte)而不是一个字符(char)。

注意:不能将 bytearray 完全等同于 C 的字符数组,因为 bytearray 远比字符数组强大。

下面创建一个与上面的 C 语言字节数组拥有相同内容的 bytearray 对象:

>>> a_obj = bytearray((0x02, 0x03, 0x0A, 0x41))
>>> a_obj
bytearray(b'\x02\x03\nA') # 以转义序列或 ASCII 编码显示相应数值
>>> [ x for x in a_obj]
[2, 3, 10, 65] # 每个索引位置始终对应一个数值,而非一个字符

1.1 如何显示数值

如果某个索引位置的数值对应 ASCII 编码中的可见字符,那么该索引位便会显示该字符:

>>> bytearray((0x41, 0x42))
bytearray(b'AB')

如果某个索引位置的数值对应 ASCII 编码中的不可见字符,但该字符拥有"独立转义序列",那么该索引位置会显示该"独立转义序列":

>>> bytearray((0x0A, 0x0D))
bytearray(b'\n\r')

如果某个索引位置的数值对应 ASCII 编码中的不可见字符,并且该字符没有"独立转义序列";或该数值已超出了 ASCII 编码的范围。那么该索引位置会显示十六进制('\xhh')转义序列。在 bytearray 对象中,十六进制('\xhh')转义序列用于表示具有指定数值的字节。

>>> bytearray((0x01, 0xFE))
bytearray(b'\x01\xfe')

将 bytearray 对象中各个字节的数值,尽力按照 ASCII 编码显示为相应字符的好处是:如果 bytearray 对象是一个 ASCII 编码的字节序列,那么便可直接读懂其中的内容,无需解码:

>>> hi = bytearray('hello!\n','ascii')
>>> hi
bytearray(b'hello!\n') # 虽然是字节序列,但是不用解码也读懂
>>> hi.decode('ascii')
'hello!\n'

再次提醒:bytes 对象是一个实实在在的字节序列,每个索引位置对应一个数值而不是一个字符。在读取 bytes 对象的任意索引位置时,只会得到某个数值,不会得到 ASCII 字符。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,277评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,689评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,624评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,356评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,402评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,292评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,135评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,992评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,429评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,636评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,785评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,492评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,092评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,723评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,858评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,891评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,713评论 2 354

推荐阅读更多精彩内容