python3 byte 字面值_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'——该方案在出现编码错误时会抛出 UnicodeError。errors 可以是 '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 "", line 1, in

bytearray('鲸','ascii')

UnicodeEncodeError: 'ascii' codec can't encode character '\u9cb8' in position 0: ordinal not in range(128)

>>> bytearray('鲸','ascii','ignore')

bytearray(b'')

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 字符。

<think>好的,我现在要处理用户提供的这个XML数据,里面有一个Base64编码的字节数组。首先,我需要理解用户的需求是什么。他们可能想知道这个结构是什么,或者如何解析它。 首先,看看这个XML的结构。最外层是<Data>标签,里面有一个<ByteArray>元素,属性是encoding="base64",然后CDATA部分里的内容是SGVsbG8gd29ybGQ=。我知道Base64编码通常用于将二进制数据转换为文本格式,方便传输。所以,这个例子中的内容应该解码后是某种可读的文本。 接下来,我需要验证这个Base64字符串解码后的结果是否正确。SGVsbG8gd29ybGQ=,解码的话,先拆分。Base64每个字符对应6位,所以需要将整个字符串转换为二进制,然后重新分组为8位的字节。不过可能更简单的方法是使用在线的工具或者编程语言中的库来解码。例如,在Python中可以使用base64模块的b64decode函数。假设这里解码后是"Hello world",因为这是常见的例子。 然后,用户可能希望了解这种结构的用途。通常在XML中嵌入二进制数据,比如图片、文件等,会使用Base64编码,因为XML本身是文本格式,不能直接处理二进制。所以这样的结构允许在XML文档中安全地包含二进制内容。 用户可能还想知道如何处理这样的数据。比如,如何解析XML,提取Base64字符串,然后解码得到原始数据。可能需要使用XML解析器,如Python的xml.etree.ElementTree,先读取<ByteArray>标签的内容,然后进行解码。 另外,用户可能对CDATA部分有疑问。CDATA用于在XML中表示不需要转义的文本内容,这样里面的特殊字符不会被解析为XML标签。在这里使用CDATA可能不是必须的,因为Base64编码后的字符串通常不包含XML敏感字符,但使用CDATA可以确保任何字符都不会被误解。 还需要考虑可能的错误情况,比如Base64字符串不正确,或者编码方式不是Base64(比如可能是hex或其他),但根据例子中的属性,encoding明确是base64,所以应该没有问题。 最后,总结这个结构的作用:在XML中通过Base64编码嵌入二进制数据,使用CDATA确保数据完整性,方便在不同系统间传输和解析。</think>你提供的 XML 结构是一种用于存储二进制数据的常见格式,其核心是通过 **Base64 编码**将二进制内容转换为文本格式,以便在 XML 中安全存储和传输。以下是详细解析: --- ### 1️⃣ **XML 结构解析** ```xml <Data> <ByteArray encoding="base64"> <![CDATA[SGVsbG8gd29ybGQ=]]> </ByteArray> </Data> ``` - **`<Data>`**:根标签,表示数据容器。 - **`<ByteArray encoding="base64">`**:子标签,声明内部数据是 Base64 编码的字节数组。 - **`<![CDATA[...]]>`**:包裹 Base64 字符串,确保 XML 解析器不会因特殊字符(如 `<`, `>`)而报错。 --- ### 2️⃣ **Base64 解码示例** 你提供的 Base64 字符串 `SGVsbG8gd29ybGQ=` 解码后为: ```plaintext Hello world ``` - **解码工具**:可通过在线工具(如 base64decode.org)或编程语言(如 Python 的 `base64.b64decode()`)验证。 --- ### 3️⃣ **实际应用场景** 这种结构常用于: - **传输二进制文件**(如图片、PDF、音频)通过文本协议(如 XML/JSON)。 - **存储加密内容**(如密码哈希)或序列化对象。 - **跨平台兼容性**:确保不同系统能正确解析二进制数据。 --- ### 4️⃣ **代码示例(Python 解析)** 若需提取并解码 XML 中的内容: ```python import base64 from xml.etree import ElementTree as ET xml_data = &#39;&#39;&#39; <Data> <ByteArray encoding="base64"> <![CDATA[SGVsbG8gd29ybGQ=]]> </ByteArray> </Data> &#39;&#39;&#39; root = ET.fromstring(xml_data) byte_array = root.find(".//ByteArray").text decoded_data = base64.b64decode(byte_array).decode(&#39;utf-8&#39;) print(decoded_data) # 输出: Hello world ``` --- ### 5️⃣ **注意事项** - **编码一致性**:确保解码时使用与编码相同的字符集(如 UTF-8)。 - **数据完整性**:CDATA 并非必需,但能避免 XML 特殊字符问题。 - **性能**:Base64 会使数据体积增加约 33%,大文件需权衡使用。 希望以上解释能帮助你理解这种数据结构的用途和实现方式!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值