打包和解包
回憶上次内容
- ASCII 由這樣幾類字元構成
- 電報時代對于英文、數字的編碼
- 這摩斯電碼是3進制的編碼方式
- 怎麼演化成ascii這種0101的二進制編碼的呢?
回到 ASCII 碼
- 電報傳過來的信号需要記錄下來
- 于是有了電傳打字機(tele-typewriter)
- 電傳打字機需要統一的編碼字母和數字
- ASCII的第一個商業用途
- 是作為一個七位電傳打字機(tele-typewriter)代碼
ASCII的演化(evolve)
- 1960年10月6日
- 美國标準協會(ASA)X3的首次會議
- ASCII标準的工作開始了
- 美國标準協會
- 現為美國國家标準協會
- American National Standards Institute
- 簡稱ANSI
- 開始敲定ASCII具體編碼
編碼來源
- 否則錯誤編碼一旦成為标準
- 我想把所有 ASCII 字元 0-127 全都打出來
回憶show.py
for n in range(0xff):
print(chr(n),end="")
if n % 16 == 0:
print()
- 這輸出靠的是
- 但是沒有看到0
- 我能否将位元組解碼(decode)來幹這個事?
struct
- 首先是要獲得從0到127的位元組狀态
- struct 是一個包(module)
- struct是結構的意思
- 來自于c裡面常用類型的存儲結構
- 這個struct怎麼用呢?
pack
位元組表示法
位元組形态
- 為了清楚起見
- 把b"\x61"表示為b"a"
- 這樣也就直接看到了字元
- 剛好ord("a") 就是 0x61
- 如何了解struct.pack呢?
封包pack
周遊
import struct
for n in range(0,128):
b = struct.pack("b",n)
print(b,end=",")
周遊結果
- 從位元組狀态可以看到已經有
- 還有
- \r、\n、\t
- 這是啥意思?
- 怎麼還能有兩個字元呢?
- 不管他
- 先加上換行
換行
- 隐約看到了ascii碼的結構
- 需要對位元組狀态解碼(decode)
解包
封包再解包
import struct
for n in range(0,127):
b = struct.pack("b",n)
c = struct.unpack("b",b)[0]
print(chr(c),end="")
if n % 16 == 0:
print()
封包再解碼
import struct
for n in range(0,127):
b = struct.pack("b",n)
s = b.decode("ascii")
print(s,end="")
if n % 16 == 0:
print()
- 和原來chr方法得到的結果差不多
- 但是沒有看到字元0
- 我們先去總結一下吧
總結
- struct包可以讓我們使用封包格式
- 把數字封包到位元組裡
- 我們通過封到不同位元組的數字
- 還是有那片黑色的區域
- 我們下次向黑暗森林區域進發!!
- 去準備行裝吧
- 藍橋->https://www.lanqiao.cn/teacher/3584
- github->https://github.com/overmind1980/oeasy-python-tutorial
- gitee->https://gitee.com/overmind1980/oeasypython
- 視訊->https://www.bilibili.com/video/BV1CU4y1Z7gQ 作者:oeasy