Python內置數據結構——bytes,bytearray

bytes,bytearray

字元串與bytes

  • 字元串是字元組成的有序序列,字元可以使用編碼來理解
  • bytes是位元組組成的有序的不可變序列
  • bytesarray是位元組組成的有序的可變序列

編碼與解碼

  • 字元串按照不同的字符集編碼encode返回字序列bytes

            bytes.encode(encoding = 'utf - 8',errors = 'stirct') -> bytes

  • 位元組序列按照不同的字符集解碼decode 返回字元串

            bytes.decode(encoding = "utf - 8",errors = "strict") -> str

            bytearray.decode(encoding ="utf - 8",errors = "strict" ) -> str

ASCII

            ASCII(American Standard Code for information Interchange,美國資訊交換標準程式碼)是基於拉丁字母的一套單位元組編碼系統

bytes定義

  • bytes() 空bytes
  • bytes(int) 指定位元組bytes,被0填充
  • bytes(iterable_of_ints) -> bytes[0~255] 的int組成的可迭代對象
  • bytes(string,encodeing[,errors]) -> bytes  等價於string.encode()
  • bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer從一個位元組序列或者buffer複製出一個新的額不可變的bytes對象
  • 使用b 前綴定義

            只允許基本ASCII使用字元形式 b'abc9'

            使用16進位表示b'x41x61'

bytes操作

  • 和str類型類似,都是不可變類型,所以方法很多都一樣,只不過bytes的方法,輸入是bytes,輸出是bytes
    • b'abcdef'.replace(b'f',b'k')
    • b'abc'.find(b'b')
  • 類方法 bytes.fromhex(string)
    • string必須是2 個字元的16進位的形式,"6162 6a 6b", 空格將被忽略
    • bytes.fromhex("6162 09 6a 6b00")
  • hex()
    • 返回16 進位表示的字元串
    • "abc".encode().hex()
  • 索引
    • b.'abcdef'[2] 返回該位元組對應的數,int類型

bytearray定義

定義:

  • bytearray()空bytearray
  • bytearray(int) 指定位元組的bytearray, 被0 填充
  • bytearray(iterable_of_ints) -> bytearray  [0,255]的int組成的可迭代對象
  • bytearray(string,encoding[,errors]) -> bytearry 近似string.encode() ,不過返回可變對象
  • bytearray(bytes_or_buffer)從一個位元組序列或者buffer複製出一個新的可變的bytearray對象

注意:b前綴定義的類型是bytes類型

bytearray操作

  • 和bytes類型的方法相同
    • bytearray(b'abcdef').replace(b'f',b'k')
    • bytearray(b'abc').find(b'b')
  • 類方法 bytearray.fromhex(string)
    • string必須是2 個字元的16進位的形式,『6162 6a 6b』,空格將被忽略
    • bytearray.fromhex('6162 09 6a 6b00')
  • hex()
    • 返回16 進位表示的字元串
    • bytearray('abc'.encode()).hex()
  • 索引
    • bytearray(b'abcdef')[2] 返回該位元組對應的數,in類型
  • .append(int)尾部追加一個元素
  • .insert(index,int)在指定索引位置插入元素
  • .extend(iterable_of_ints) 講一個可迭代的整數集合追加到當前bytearray
  • .pop(index = -1)從指定索引上移除元素,默認從尾部移除
  • .remove(value)找到第一個value移除,找不到拋value error

注意: 上述方法若需要使用int類型,值在[0,255]

  • .clear() 清空bytearray
  • .reverse()翻轉bytearray ,就地修改

int 和 bytes 之間轉換

  • int.from_bytes(bytes,byteorder)
  • 將以個位元組數組表示成整數
  • int.to_bytes(length, byteorder)
  • byteorder 指位元組序(大端big)
  • 將一個整數表達成一個指定長度的位元組數組
i = int.form_bytes(b.'abc', 'big')  print( i , hex()) # 6382179  0x616263  printn(i.to_bytes(3 , 'big')) # b'abc'

所有數據在記憶體中全部都是2進位的形式,人要理解一個記憶體中的數據必須先要指定它的類型,否則這個數據是沒有意義的

一個位元組 = 8位

一個位元組0~255

兩個位元組0~65535

0~255

0~127

大小端的意思是在記憶體中數據是如何存放的 (大小端代表著高低位元組)例如:如果給兩個位元組ab 是a放高地址呢還是b放高地址呢

低位元組放在高地址上,大端模式big

低位元組放在小地址上,小端模式little

高低位元組的排放順序~~~

網路上採用大端模式

windows內部採用小端模式

mac用大端模式

Tags: