一直以來,對python中的字元,位元組,編碼格式理解的懵懵懂懂的,遇到問題總是搞不清楚,最近看一些網路傳輸方面的知識時,剛好要用到這些知識,總結一下以備以後複習。
首先說byte,也叫位元組,乙個位元組是8個bit。在python中,最小的資料儲存單位就是位元組,ascii碼中字元在python中都是佔乙個位元組的儲存位。
英文本元都包含在ascii編碼中,所以所有的英文本元都是佔1個位元組的,(注意字元和單詞的區別)
s=
'a'print
(s.encode(
'utf8'))
print
(s.encode(
'gbk'))
print
(len
(s.encode(
'gbk'))
)# 結果
b'a'
b'a'
1
因為計算機是美國人發明的,所以他們的英文字符集就很好處理,但是漢字的字元在計算機中應該怎麼儲存呢?這裡就牽扯到了編碼和解碼,針對漢字的編碼最常用的有utf8
和gbk
,在網路傳輸或者字元儲存的時候就需要把字元先編碼成位元組碼,然後再傳送/儲存。在接收或讀取的時候進行解碼。
han =
'中'print
(len
(han)
)print
(han.encode(
'utf8'))
print
(han.encode(
'gbk'))
print
(len
(han.encode(
'utf8'))
)print
(len
(han.encode(
'gbk'))
)# 結果
1b'\xe4\xb8\xad'
b'\xd6\xd0'
32
在網路傳輸中對數字也是編碼成位元組碼進行傳輸的。int
型字元直接呼叫int.to_bytes()
方法進行編碼
i =
65print
(i.to_bytes(
4,byteorder=
'big'
,signed=
false))
print
(i.to_bytes(
8,byteorder=
'big'
,signed=
false))
# 結果
b'\x00\x00\x00a'
b'\x00\x00\x00\x00\x00\x00\x00a'
這樣就完成了對整型資料的編碼,解碼也是逆序,使用int.from_bytes()
方法進行解碼:
i =
65i_byte_4 = i.to_bytes(
4,byteorder=
'big'
,signed=
false
)print
(i_byte_4)
i_byte_8 = i.to_bytes(
8,byteorder=
'big'
,signed=
false
)print
(i_byte_8)
i_decode_4 =
int.from_bytes(i_byte_4,byteorder=
'big'
,signed=
false
)print
(i_decode_4)
i_decode_8 =
int.from_bytes(i_byte_8,byteorder=
'big'
,signed=
false
)print
(i_decode_8)
# 結果
b'\x00\x00\x00a'
b'\x00\x00\x00\x00\x00\x00\x00a'
6565
需要特別注意的是:解碼時,from_bytes()
中傳入的後兩個個引數要和to_bytes()
嚴格對應,否則解碼肯定出錯
這裡注意的是,網路中傳送的資料報都是位元組碼,所以在傳送的時候,對不同的資料格式就要進行資料編碼,而在接收的時候同樣按照接收的資料的編碼方式進行解碼,這樣就能得到原始資料。
不同編碼格式中,位元組和字元的關係
ascii碼中 乙個英文本母 不分大小寫 佔乙個位元組的空間,乙個中文漢字佔兩個位元組的空間。乙個二進位制數字序列,在計算機中作為乙個數字單元,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。utf 8編碼中 乙個英文本元等於乙個位元組,乙個中文 含繁體 等於三個位元組。unicode...
字元位元組區別,各種編碼格式作用
字元 由數字,字母,標點符號,各種符號。組成的都叫做字元。位元組 位元組是計算機中儲存容量的基本單位,1位元組是在計算機中是8位。也就是從 00000000到11111111。在計算機裡面,無論你什麼樣的檔案,到最後都會被轉為0,1的組成序列來表示,那麼問題來了,我們肯定要制定規則呀,比如00011...
位 位元組 編碼格式
位 bit 計算機中最小的資料單位。每一位的狀態只能是0或1。位元組 byte 儲存空間的基本計量單位,8個二進位制位構成乙個位元組 編碼格式 ascii 127個字元被編碼到計算機裡,也就是大小寫英文本母 數字和一些符號 unicode 把所有語言都統一到一套編碼裡,解決亂碼問題 gbk 有一位元...