admin 发表于 2018-1-1 22:56:17

7.2 二进制数据之字节和字节数组

   处理文本数据比较晦涩难懂(新旧格式化、正则表达式等),而处理二进制数据就有趣多了。你需要了解像字节序(endianness,电脑处理器是如何将数据组织存储为字节的)以及整数的符号位(sign bit)之类的概念。你可能需要研究二进制文件格式、网络包等内容,从而对其中的数据进行提取甚至修改。本节将了解到 Python 中有关二进制数据的一些基本操作。

    Python 3 引入了下面两种使用 8 比特序列存储小整数的方式,每 8 比特可以存储从 0~255的值:
• 字节是不可变的,像字节数据组成的元组;
• 字节数组是可变的,像字节数据组成的列表。
    我们的示例从创建列表 blist 开始。接着需使用这个列表创建一个 bytes 类型的变量 the_bytes 以及一个 bytearray 类型的变量 the_byte_array:blist =
the_bytes=bytes(blist)
the_byte_array = bytearray(blist)
print(the_bytes)
print(the_byte_array)输出:b'\x01\x02\x03\xfe\xff'
bytearray(b'\x01\x02\x03\xfe\xff')下面两行代码都会创建一个包含 256 个元素的结果,包含 0~255 的所有值:
>>> the_bytes = bytes(range(0, 256))
>>> the_byte_array = bytearray(range(0, 256))
   打印 bytes 或 bytearray 数据时, Python 会以 \xxx 的形式表示不可打印的字符, 以 ASCII字符的形式表示可打印的字符(以及一些转义字符,例如 \n 而不是 \x0a)。下面是 the_bytes 的打印结果(手动设置为一行显示 16 个字节):
   
   看起来可能有些困惑,毕竟上面输出的数据是字节(小整数)而不是字符。

admin 发表于 2018-1-1 23:05:05

bytes 类型值的表示形式比较特殊:以 b 开头,接着是一个单引号,后面跟着由十六进制数(例如 \x02)或 ASCII 码组成的序列,最后以配对的单引号结束。 Python 会将这些十六进制数或者 ASCII 码转换为整数,如果该字节的值为有效 ASCII 编码则会显示 ASCII 字符。
>>> b'\x61'
b'a'
>>> b'\x01abc\xff'
b'\x01abc\xff'
页: [1]
查看完整版本: 7.2 二进制数据之字节和字节数组