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'