中途回顧,bytes數據類型是什麽,和字符串什麽關系
參考:https://segmentfault.com/a/1190000004450876
Bytes 對象是由單個字節作為基本元素(8位,取值範圍 0-255)組成的序列,為不可變對象。
Bytes 對象只負責以二進制字節序列的形式記錄所需記錄的對象,至於該對象到底表示什麽(比如到底是什麽字符)則由相應的編碼格式解碼所決定。我們可以通過調用 bytes() 類(沒錯,它是類,不是函數)生成 bytes 實例,其值形式為 b‘xxxxx‘,其中 ‘xxxxx‘ 為一至多個轉義的十六進制字符串(單個 x 的形式為:\xHH,其中 \x 為小寫的十六進制轉義字符,HH 為二位十六進制數)組成的序列,每個十六進制數代表一個字節(八位二進制數,取值範圍 0-255),對於同一個字符串如果采用不同的編碼方式生成 bytes 對象,就會形成不同的值:
比如上例中的 a 字符串對象,其十進制 unicode 值為 24464,分別使用 ‘utf-8‘ 和 ‘gb2312‘ 兩種編碼格式將其轉換成 bytes 對象 b 和 c ,結果 b 和 c 的值是完全不同的,由於基於的編碼格式不一致, b c 長度甚至都不相同,前者有 3 個字節長度,後者有 2 個字節長度:
另外,對於 ASCII 字符串,可以直接使用 b‘xxxx‘ 賦值創建 bytes 實例,但對於非 ASCII 編碼的字符則不能通過這種方式創建 bytes 實例:
由於 bytes 是序列,因此我們可以通過索引或切片訪問它的元素:
可以發現如果以單個索引的形式訪問元素,其會直接返回單個字節的十進制整數,而以序列片段的形式訪問時,則返回相應的十六進制字符序列。
對於 bytes 實例,如果需要還原成相應的字符串,則需要借助內置的解碼函數 decode(),借助相應的編碼格式解碼為正常字符串對象,如果采用錯誤的編碼格式解碼,則有可能發生錯誤:
中途回顧,bytes數據類型是什麽,和字符串什麽關系