⚒️第七章 bytes和bytearray
00 min
2024-4-24
2024-5-19
type
status
date
slug
summary
tags
category
icon
password

Python3中引入两个新的内置数据类型bytes和bytearray
  • bytes:不可变字节序列;
  • bytearray:可变字节数组。
字符串是字符组成的有序序列,字符可以使用编码来理解,而bytes和bytearray是字节组成的有序序列。将字符按照不同的字符集编码encode返回字节序列bytes,将字节序列按照不同的字符集解码decode返回字符串。
        在计算机世界,数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制)。
        一个字节(byte,简写为B)由8个位(bit,简写为b)组成,四个二进制数可以由一个十六进制数表示,二进制0000~1111对应十六进制的0~F。则一个字节可以用两个十六进制数表示。
在计算机世界,数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制)。 一个字节(byte,简写为B)由8个位(bit,简写为b)组成,四个二进制数可以由一个十六进制数表示,二进制0000~1111对应十六进制的0~F。则一个字节可以用两个十六进制数表示。

7.1 bytes

7.1.1 bytes初始化

  • bytes() -> empty bytes object
  • bytes(int) -> bytes object of size given by the parameter initialized with null bytes
  • bytes(string, encoding[, errors]) -> bytes
  • bytes(iterable_of_ints) -> bytes
  • bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
  • 使用b前缀定义
    • 只允许基本ASCII使用字符形式:b”abc9”
    • 使用16进制表示:b”\x41\x61”

7.1.2 索引和遍历

bytes是有序的字节序列,可以通过索引来进行访问,返回的是对应字节的十进制数。同样,切片对bytes类型也是有效的。对bytes类型进行遍历,其实遍历的字节返回的是十进制整数。

7.1.3 bytes操作方法

bytes和str类型,它们都是不可变类型,操作方法几乎一样。只不过要注意的是,str的方法操作的是str类型数据,而bytes的方法操作的是bytes类型数据。

7.1.4 类方法构造

bytes就是字节序列,最好书写的方式就是16进制的字符串表达,例如“6162 6a 6b”,这个字符串中的空格将被忽略。

7.1.5 十六进制表达

一个bytes对象,就是一个个字节的序列,完全可以把每个字节用16进制表达。
注意,encode是将字符”abjk“进行编码,将每个字符按照ASCII表转换成字节表示形式,而bytes对象的hex方法是返回bytes对象中每个字节的十六进制字符串表达形式
 

7.2 bytearray

7.2.1 初始化

  • bytearray(iterable_of_ints) -> bytearray
  • bytearray(string, encoding[, errors]) -> bytearray
  • bytearray(bytes_or_buffer) -> mutable copy of bytes_or_buffer
  • bytearray(int) -> bytes array of size given by the parameter initialized with null bytes
  • bytearray() -> empty bytes array
b前缀表示的是bytes,不是bytearray类型

7.2.2 索引

bytearray类型是可变数据类型,类似列表,故bytearray的索引操作也和list基本一致。

7.2.3 bytearray操作方法

和bytes类型,同时作为可变数据类型,bytearray有很多方法也和列表相同。

7.2.4 类方法构造

bytearray就是字节数组,最好书写的方式就是16进制的字符串表达,例如’6162 6a 6b’,字符串中空格将被忽略。

7.2.5 十六进制表达

一个bytearray对象,就是一个个字节的序列,完全可以把每个字节用十六进制表示。
 

字节序

内存中对于超过一个字节数据的分布方式。
notion image
  • 大端模式,big-endian;小端模式,little-endian
  • intel X86 CPU使用小端模式
  • 网络传输更多使用大端模式
  • Windows、Linux使用小端模式
  • Mac OS使用大端模式
  • Java虚拟机是大端模式

int和bytes互换

在内存中,是无差别的0和1,当你为他赋予了数据类型之后,它才能够理解这个0和1到底是什么。
  • int.from_bytes(bytes, byteorder)
    • 按照指定字节序,将一个字节序列表示成整数(没有int对象,通过bytes转化)
  • int.to_bytes(length, byteorder)
    • 按照指定字节序,将一个整数表达成一个指定长度的字节序列(将已存在的int对象转化为bytes对象)