python-4-bytes和bytearray


bytes、bytearray
  • python3引入了兩個新類型
    • bytes
      • 不可變字節序列
      • 可以簡單認為字節組成的列表
    • bytearray
      • 字節數組
      • 可變

字節組成的序列,字符串組成序列,有什么差異?

  • 字符串以字符為單位
  • 字節是以單個字節為單位,網絡傳輸時候,很重要

bytes不可變,所以出現了bytearray這種類型

字符串拼接,用‘+’效率不是很高,所以要用format,格式化字符串,format做了效率優化。
所有的數據,都能夠用bytes來處理。
python當中,最主要還是用bytes處理字符串

  • 字符串與bytes
    • 字符串是字符組成的有序列表,字符可以使用編碼來理解
    • bytes是字節組成的,有序的,不可變序列
    • bytearray是字節組成的,有序的,可變序列
  • 編碼與解碼
    • 字符串按照不同的字符集編碼encode返回字節序列bytes
      • encode(encoding='utf-8',error='strict') - bytes - 不可變的
    • 字節序列按照不同的字符集編碼decode返回字符串
      • bytes.decode(encoding='utf-8',error='strict') - str
      • bytearray.decode(encoding='utf-8',error='strict') - str
- gb2312、gbk都是2個字節上面玩
- unicode編碼,是多字節玩
- 內存中的數據,都是字節,你需要告訴內存,是什么編碼,才能找到數字對應的字符。
- linux默認編碼是utf-8,windows默認編碼是gbk
- linux回車換行符是\r\n,windows下面的回車換行符是\n
- 這是linux和windows對打字機的理解方式不一樣
- linux換行,自動到下一行,再回到頭。
- windows是先回到頭,再下來。
- 這就是大家對不同操作系統不同編碼的理解。
- 字符串的編碼,是可以理解的。
- 編碼無非就是一個編碼表,告訴你某一個數字和某一個字符之間的對應。
- 這些字符能夠顯示在屏幕上,要到字庫當中,找對應的點陣映射。
- 然后把點陣映射,映射到屏幕上的點陣上面。
  • 列表封裝的比數組比較復雜。
  • 列表的c語言源碼當中,封裝的其實,還是數組。
bytes定義
  • 定義
    • bytes()空bytes,沒用
    • bytes(int) 指定字節的bytes,被0填充
    • bytes(iterable_of_ints) -> bytes [0,255]的int組成的可迭代對象
    • bytes(string,encoding[,errors]) -> bytes等價於string.encode()
    • bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer
    • 從一個字節序列或者buffer復制出一個新的不可變的bytes對象
    • 使用b前綴定義
      • 只允許基本ASCII使用字符形式b'abc9'
      • 使用16進制表示b"\x41\x61"
  • 和str類型相似,都是不可變類型,所以方法很多都一樣。只不過bytes的方法,輸入是bytes,輸出是bytes
    • b'abcdef'.replace(b'f',b'k')
    • b'abc'.find(b'b')
  • 類方法 bytes.fromhex(string)
    • 類似於java和c++當中的靜態方法
    • string必須是2個字符的16進制的形式,'6162 6a 6b',空格將被忽略
    • bytes.fromhex('6162 09 6a 6b00')
  • hex()
    • 返回16進制表示的字符串
    • 'abc'.encode().hex()
  • 索引
    • b'abcdef'[2]返回該字節對應的數,int類型。

有序的序列,一定可以索引和迭代

bytearray定義
  • 定義
    • bytearray()空bytes
    • bytearray(int)指定字節的bytearray,被0填充
    • bytearray(iterable_of_ints) -> bytearray [0,255]的int組成的可迭代對象
    • bytearray(string,encoding[,errors]) -> bytearray 近似string.encode() 不過返回可變對象
    • bytearray(bytes_or_buffer)從一個字節序列或者buffer復制出一個新的可變的bytearray對象
      • 這個方法,可以將bytes轉變成為bytearray,消耗一次內存拷貝。

注意,b前綴定義的類型是bytes類型
buffer本身,就是一個bytearray

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]返回該字節對應的數,int類型
bytearray操作
  • append(int)尾部追加一個元素

  • insert(index,int)在指定索引位置插入元素

  • extend(iterable_of_ints)將一個可迭代的整數集合追加到當前bytearray

  • pop(index=-1)從指定索引上移除元素,默認從尾部移除

  • remove(value)找到第一個value移除,找不到拋ValueError異常

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

  • clear() 清空bytearray

  • reverse() 翻轉bytearray,就地修改

  • b = bytearray()

  • b.append(97)

  • b.append(99)

  • b.insert(1,98)

  • b.extend([65,66,67])

  • b.remove(66) # 找不到拋出異常,一定要注意處理異常

  • b.pop

  • b.reverse()

  • b.clear()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM