摘要:回到對字節和字節數組的定義為了用計算機可以理解的數字描述人類使用的字符,我們需要一張數字與字符對應的表。由于和字符串一樣是序列類型,字節和字節數組可用的方法也類似,這里就不一一列舉了。
項目地址:https://git.io/pytips
0x07 中介紹了 Python 中的字符串類型,字符串類型是對人類友好的符號,但計算機只認識一種符號,那就是二進制(binary)數,或者說是數字:
上面這張圖片來自 OpenCV,非常直觀地解釋了計算機處理的信息與我們看到的圖像之間的關系。回到 Python 對字節和字節數組的定義:
1Byte of ASCIIThe core built-in types for manipulating binary data are bytes and bytearray.
為了用計算機可以理解的數字描述人類使用的字符,我們需要一張數字與字符對應的表。我們都知道在計算機中 1 byte = 8bits,可以存儲 0~255 共256個值,也就是說 1byte 最多可以表示 256 個字符,在最初的計算機世界中,256 足以容納所有大小寫英文字母和 0~9 阿拉伯數字以及一些常用的符號,于是就有了 ASCII 編碼:
在 Python 中創建字節與字符串類似,只不過需要在引號外面加一個前綴b:
print(b"Python") python = (b"P" b"y" b"t" b"o" b"n") print(python)
b"Python" b"Pyton"
Bytes 代表的是(二進制)數字的序列,只不過在是通過 ASCII 編碼之后才是我們看到的字符形式,如果我們多帶帶取出一個字節,它仍然是一個數字:
print(b"Python"[0])
80
我們可以用 b"*" 的形式創建一個字節類型,前提條件是這里的 * 必須是 ASCII 中可用的字符,否則將會超出限制:
print(b"雨")
File "", line 1 print(b"雨") ^ SyntaxError: bytes can only contain ASCII literal characters.
錯誤提示說明:字節類型只能允許 ASCII 字符。
0~127~255
那么問題來了,我們發現上面的 ASCII 表里面所有的字符只占據了 [31, 127],那對于這一范圍之外的數字我們要怎么才能表示為字節類型?答案就是用特殊的轉義符號x+十六進制數字 :
print(b"xff"[0]) print(b"x24")
255 b"$"
反過來我們也可以將數字(0~255)轉變成轉義后的字節類型:
print(bytes([24])) print(bytes([36,36,36])) # 記住字節類型是一個序列
b"x18" b"$$$"
或者直接從十六進制得來:
print(bytes.fromhex("7b 7d")) # 逆運算 print(b"{ }".hex()) int(b" ".hex(), base=16)
b"{}" 7b207d
32encode
字符串有 decode 方法,而字節有 encode 方法,我們這里先簡單看一下 encode("ascii") 。對于給定的字符我們可以通過編碼得到它在編碼表里面的坐標(即碼位),因此對字符進行encode("ascii")操作是找到其在 ASCII 中的位置:
print("$".encode("ascii")) print("$".encode("ascii")[0])
b"$" 36
也就是說字符 "$" (0x07中已經介紹過這是一個 Unicode 編碼的字符)在 ASCII 中的位置就是 $(或者說36)。
可是如果我們對一些奇怪的字符進行 ASCII 編碼,就會發生:
snake = "?" try: snake.encode("ascii") except UnicodeEncodeError as err: print(err) # 正確的做法應該是用 UTF-8 進行編碼,因為字符串都是 UTF-8 的 print(snake.encode()) # utf-8 by default
"ascii" codec can"t encode character "U0001f40d" in position 0: ordinal not in range(128) b"xf0x9fx90x8d"
于是就得到了我們最熟悉的錯誤:ordinal not in range(128),至于為什么是 128,現在應該很好理解了吧!
字節數組和字符串一樣,字節類型也是不可變序列,而字節數組就是可變版本的字節,它們的關系就相當于list與tuple。
ba = bytearray(b"hello") ba[0:1] = b"w" print(ba)
bytearray(b"wello")
由于和字符串一樣是序列類型,字節和字節數組可用的方法也類似,這里就不一一列舉了。
總結字節(字節數組)是二進制數據組成的序列,其中每個元素由8bit二進制即1byte亦即2位十六進制數亦亦即0~255組成;
字節是計算機的語言,字符串是人類語言,它們之間通過編碼表形成一一對應的關系;
最小的 ASCII 編碼表只需要一位字節,且只占用了其中 [31,127] 的碼位;
關于字節與字符串之間的關系,將在下一期[0x08]()詳細介紹。
參考Pragmatic Unicode
歡迎關注公眾號 PyHub!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37834.html
摘要:只包含了個基本拉丁字母阿拉伯數目字和英式標點符號一共個字符,因此只需要不占滿一個字節就可以存儲,而則涵蓋的數據除了視覺上的字形編碼方法標準的字符編碼外,還包含了字符特性,如大小寫字母,共可包含個字符,而到現在只填充了其中的個位置。 項目地址:https://git.io/pytips 0x07 和 0x08 分別介紹了 Python 中的字符串類型(str)和字節類型(byte),以及...
摘要:項目地址所有用過的人應該都看過下面兩行錯誤信息這就是界的錕斤拷今天和接下來幾期的內容將主要關注中的字符串字節及兩者之間的相互轉換。 項目地址:https://git.io/pytips 所有用過 Python (2&3)的人應該都看過下面兩行錯誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...
摘要:本文包括如下內容協議第四章連接握手協議第五章數據幀庫源碼分析連接握手過程庫源碼分析數據幀解析過程參考協議深入探究本文對的概念定義解釋和用途等基礎知識不會涉及稍微偏干一點篇幅較長大約行閱讀需要耐心連接握手過程關于有一句很常見的話復用 ? 本文包括如下內容: WebSocket協議第四章 - 連接握手 WebSocket協議第五章 - 數據幀 nodejs ws庫源碼分析 - 連接...
摘要:這里的關鍵詞函數必須明確指明,不能通過位置推斷則代表任意數量的關鍵詞參數添加的新特性,使得可以在函數參數之外使用這里的逗號不能漏掉所謂的解包實際上可以看做是去掉的元組或者是去掉的字典。 項目地址:https://git.io/pytips 函數調用的參數規則與解包 Python 的函數在聲明參數時大概有下面 4 種形式: 不帶默認值的:def func(a): pass 帶有默認值的...
摘要:項目地址中內置的庫和分別提供了堆和優先隊列結構,其中優先隊列本身也是基于實現的,因此我們這次重點看一下。堆可以用于實現調度器例見之協程,更常用的是優先隊列例如。 項目地址:https://git.io/pytips Python 中內置的 heapq 庫和 queue 分別提供了堆和優先隊列結構,其中優先隊列 queue.PriorityQueue 本身也是基于 heapq 實現的,因...
閱讀 3011·2021-10-27 14:15
閱讀 2999·2021-09-07 10:18
閱讀 1320·2019-08-30 15:53
閱讀 1570·2019-08-26 18:18
閱讀 3373·2019-08-26 12:15
閱讀 3460·2019-08-26 10:43
閱讀 654·2019-08-23 16:43
閱讀 2207·2019-08-23 15:27