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