python——bytes、bytearray


1、python3引入兩個新類型
  1>bytes:
    在內存中連續存放的不可變字節序列

  2>bytearray:
    字節數組、可變

  3>字符串與bytes
    字符串是字符組成的有序序列,字符可以使用編碼來理解
    bytes是字節組成的有序的不可變序列
    bytearray是字節組成的有序的可變序列

  4>編碼與解碼
    字符串按照不同的字符集編碼encode返回字節序列bytes
      encode(encoding='utf-8', errors='strict') → bytes

# -*- coding:utf-8 -*-
# version:python3.7

s1 = ''.encode(encoding='gbk')    #按gbk編碼
s2 = s1.decode(encoding='gbk')      #按gbk解碼,編碼解碼得對應,要不然會出錯
print(s1,s2)

執行結果:
b'\xb0\xa1'

    字節序列按照不同的字符集解碼decode返回字符串
      bytes.decode(encoding="utf-8", errors= "strict") → str
      bytearray.decode(encoding="utf-8", errors="strict") → str

# -*- coding:utf-8 -*-
# version:python3.7

s1 = 'abc'
b1 = s1.encode()
print(s1,b1)
s2 = b1.decode()
print(s2)

b2 = bytearray(b1)
print(b2)

執行結果:
abc b'abc'
abc
bytearray(b'abc')

 

2、ASCII
  ASCII (American Standard Code for Information Interchange,美國信息交換標准代碼) 是基於拉丁字母的一套單字節編碼系統

  

 

   熟記:

Tab、回車、換行        對應ASCII表10進制數
     \t                     9
     \r                     13
     \n                     10


數值、字母 對應ASCII表16進制數
0~9 1:31(16進制) → 3*16+1=49(10進制) A-Z A:41(16進制) → 4*16+1=65(10進制) a-z a:61(16進制) → 6*16+1=97(10進制)

  編碼表:

ASCII:   0-127
Unicode: 全球統一編碼(雙字節表達,中英都是)
GBK:     英文用單字節,中文用雙字節
UTF-8:   中文三字節,英文單字節

 

3、bytes定義
  bytes()    空bytes

# -*- coding:utf-8 -*-
# version:python3.7

b1 = bytes()
b2 = b''
print(b1,b2)

執行結果:
b'' b''

  bytes(int)    指定字節的bytes,被0填充

# -*- coding:utf-8 -*- 
# version:python3.7


print
(bytes(3)) 執行結果: b'\x00\x00\x00'

  bytes(iterable_of_ints) → bytes [0,255]    的int組成的可迭代對象

# -*- coding:utf-8 -*-
# version:python3.7

print(bytes([61,62]))      #ASCII:十進制61,62 -> '=>'
print(bytes([0x61,0x62]))  #ASCII:十六進制61,62 -> 'ab'
print(bytes([97,98]))      #ASCII:十六進制97,98 -> 'ab'

執行結果:
b'=>'
b'ab'
b'ab'

       bytes(string, encoding[ errors]) → bytes    等價於string.encode()

# -*- coding:utf-8 -*- 
# version:python3.7


print
(bytes('abc','utf8')) print('abc'.encode()) 執行結果: b'abc' b'abc'

  bytes(bytes_or_buffer) → immutable copy of bytes_or_buffer    從一個字節序列或者buffer復制出一個新的不可變的bytes對象

# -*- coding:utf-8 -*- 
# version:python3.7

b1 = bytes([0x61,0x62]) b2 = b1 #認為重新包裝成字節序列 print(b1,b2) print(id(b1),id(b2)) #python對某些常量進行了優化,bytes和str一樣屬於字面常量 執行結果: b'ab' b'ab' 1777529096928 1777529096928

  使用b前綴定義
    只允許基本ASCII使用字符形式b'abc9'
    使用16進制表示b"\x41\x61"

 

4、bytes操作
  和str類型類似,都是不可變類型,所以方法很多都一樣,只不過bytes的方法,輸入是bytes,輸出是bytes

# -*- coding:utf-8 -*-
# version:python3.7

print(b'abcdef'.replace(b'f',b'k'))    #replace:替換
print(b'abcdef'.find(b'c'))            #find:查找,返回索引

執行結果:
b'abcdek'
2

  類方法bytes.fromhex(string)
    string必須是2個字符的16進制的形式,'61 62 6a 6b',空格將被忽略
  hex()
    返回16進制表示的字符串

    例:'abc'.encode().hex()

# -*- coding:utf-8 -*-
# version:python3.7

b1 = bytes.fromhex('6162 09 6a 6b00')
print(b1)
b2 = b1.hex()
print(b2)

執行結果:
b'ab\tjk\x00'
6162096a6b00

  索引
    例:b'abcdef'[2]    返回該字節對應的十進制數,int類型

# -*- coding:utf-8 -*-
# version:python3.7

print(b'abcdef'[2])

執行結果:
99

 

5、bytearray定義
  bytearray()    空bytearray
  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對象

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

 

6、bytearray操作
  和bytes類型的方法相同

# -*- coding:utf-8 -*-
# version:python3.7

print(bytearray(b'abcdef').replace(b'f',b'k'))
print(bytearray(b'abc').find(b'b'))

執行結果:
bytearray(b'abcdek')
1

  類方法bytearray.fromhex(string)
    string必須是2個字符的16進制的形式,'61 62 6a 6b',空格將被忽略
  hex()
    返回16進制表示的字符串

# -*- coding:utf-8 -*-
# version:python3.7

b1 = bytearray.fromhex('6162 09 6a 6b00')
print(b1)
print(b1.hex())

執行結果:
bytearray(b'ab\tjk\x00')
6162096a6b00

  索引
    例:bytearray(b'abcdef')[2]    返回該字節對應的數,int類型

# -*- coding:utf-8 -*-
# version:python3.7

print(bytearray(b'abcdef')[2])

執行結果:
99

  append(int)    尾部追加一個元素
  insert(index, int)    在指定索引位置插入元素
  extend(iterable_of_ints)     將一個可迭代的整數集合追加到當前
  pop(index=-1)    從指定索引上移除元素,默認從尾部移除
       remove(value)    找到第一個value移除, 找不到拋ValueError異常

# -*- coding:utf-8 -*-
# version:python3.7

b = bytearray(b'abcd')
print(b)
b.append(101)
print(b)
b.insert(0,65)
print(b)
b.extend(range(102,106))
print(b)
b.pop(0)
print(b)
b.remove(105)
print(b)

執行結果:
bytearray(b'abcd')
bytearray(b'abcde')
bytearray(b'Aabcde')
bytearray(b'Aabcdefghi')
bytearray(b'abcdefghi')
bytearray(b'abcdefgh')

  注意:上述方法若需要使用int類型,值在[0, 255]
  clear()        清空bytearray
  reverse()    翻轉bytearray,就地修改

 

7、字節序:
  大端模式,big-endian;小端模式,little-endian
  Intel X86 CPU使用小端模式
  網絡傳輸更多使用大端模式
  Windows、Linux使用小端模式
  Mac OS使用大端模式
  Java虛擬機是大端模式

 

 

8、int和bytes
  int.from_bytes(bytes, byteorder)
    將一個字節數組表示成整數
  int.to_bytes(length, byteorder)
    byteorder字節序
    將一個整數表達成一個指定長度的字節數組

# -*- coding:utf-8 -*-
# version:python3.7

i = int.from_bytes(b'abcd','big')    #大端模式將 bytes -> int
print(i,hex(i))
print(i.to_bytes(4,'big'))           #使用大端模式將 int -> bytes (給定四字節)

b1 = 97
print(b1.to_bytes(3,'big'))

執行結果:
1633837924 0x61626364
b'abcd'
b'\x00\x00a'

 


免責聲明!

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



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