[oeasy]python0019_ 打包和解包_struct_pack_unpack
打包和解包
回憶上次內(nèi)容
ASCII 由這樣幾類字符構成
英文大寫字符
英文小寫字符
數(shù)字
符號
電報時代對于英文、數(shù)字的編碼
使用的是摩斯電碼

這摩斯電碼是3進制的編碼方式
長短空
怎么演化成ascii這種0101的二進制編碼的呢???
回到 ASCII 碼
電報傳過來的信號需要記錄下來
于是有了電傳打字機(tele-typewriter)
電傳打字機需要統(tǒng)一的編碼字母和數(shù)字
ASCII的第一個商業(yè)用途
是作為一個七位電傳打字機(tele-typewriter)代碼

要把滴、答、停的電報信號
變成0和1的二進制信號
ASCII的演化(evolve)
1960年10月6日
現(xiàn)為美國國家標準協(xié)會
American National Standards Institute
簡稱ANSI
美國標準協(xié)會(ASA)X3的首次會議
ASCII標準的工作開始了
美國標準協(xié)會
開始敲定ASCII具體編碼

貝爾公司主要經(jīng)營電報電話
編碼來源
第一次(ASA X3.4-1963)就明確
大小寫字母之間只差一個位
這很重要

否則錯誤編碼一旦成為標準
就都廢掉了
所有應用這種錯誤編碼的文件
我想把所有 ASCII 字符 0-127 全都打出來
可以么?
回憶show.py
回憶編寫show.py
for n in range(0xff): ? ?print(chr(n),end="") ? ?if n % 16 == 0: ? ? ? ?print()
確實可以出來

這輸出靠的是
chr
把序號轉(zhuǎn)化成字符的函數(shù)
但是沒有看到0
理論上在1之前
仿佛被黑暗森林所吞沒
我能否將字節(jié)解碼(decode)來干這個事?
struct
首先是要獲得從0到127的字節(jié)狀態(tài)
struct 是一個包(module)
導入struct包

struct是結(jié)構的意思
來自于c里面常用類型的存儲結(jié)構
這個struct怎么用呢?
pack

把數(shù)字變成字節(jié)的形態(tài)
把0x61這個數(shù)字變成字節(jié)的形態(tài)

"a" 不是字符嗎???
怎么成了字節(jié)了?
字節(jié)表示法
注意細節(jié)

注意"a"前面還有一個b
"a"是字符
b"a" 是字節(jié)

這兩類型完全不同
字節(jié)b"a"是什么呢?
字節(jié)形態(tài)
字節(jié)狀態(tài)可以用兩個16進制數(shù)來表示
相當于b"\x61"
b"a"

b"a" 和 b"\x61" 是同樣的一個字節(jié)
就是字符"a"在字節(jié)里的樣子

為了清楚起見
把b"\x61"表示為b"a"
這樣也就直接看到了字符??
剛好ord("a") 就是 0x61
如何理解struct.pack呢?
封包pack
按要求把東西封進規(guī)定的封裝里面

把數(shù)字封在1個Byte里面
觀察他的字節(jié)狀態(tài)
遍歷
import structfor n in range(0,128): ? ?b = struct.pack("b",n) ? ?print(b,end=",")
把從0-127的數(shù)字都封到字節(jié)里面

可以把數(shù)字轉(zhuǎn)化成字節(jié)狀態(tài)
然后可以再把字節(jié)解碼了
遍歷結(jié)果
好多的字節(jié)呀~??

從字節(jié)狀態(tài)可以看到已經(jīng)有
這里很明顯能看到0
還有0前面的一堆符號
0、1、2、3
A、B、C
a、b、c
還有
\r、\n、\t
這是啥意思???
怎么還能有兩個字符呢?
不管他
先加上換行
換行

從0數(shù)到7
換1行
再從0數(shù)到7

隱約看到了ascii碼的結(jié)構
我想看字符狀態(tài)
我不想看字節(jié)狀態(tài)呢
需要對字節(jié)狀態(tài)解碼(decode)
struct.unpack
也就是解包
解包
這又是一圈
pack
unpack

解包出來是序號
先把0-127的數(shù)字都變成字節(jié)
封包再解包
import structfor 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方法得到的結(jié)果差不多
但是沒有看到字符0
仿佛被上面那片黑暗森林所吞沒
這可真可怕!
我們先去總結(jié)一下吧
總結(jié)
struct包可以讓我們使用封包格式
遍歷了一次ascii碼
pack函數(shù)就是封包
unpack函數(shù)就是解封
把數(shù)字封包到字節(jié)里
我們通過封到不同字節(jié)的數(shù)字
還是有那片黑色的區(qū)域
好像是一片黑暗森林!
那里面到底有些什么秘密???
我們下次向黑暗森林區(qū)域進發(fā)?。??
去準備行裝吧????
藍橋->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