打包和解包
回憶上次内容
- decode
- 就是解碼
- 解碼和編碼可以轉化
- encode 編碼
- decode 解碼
- 互為逆過程
- 大小寫字母之間序号全都相差(32)10進制
- 這是為什麼呢?
差距
- 大寫字母和小寫字母
- 總是相差(32)10進制
- 從10進制角度看不清楚
- 我們從16進制的角度看看
16進制
- 正好是(0x20)16進制
- 為什麼不多不少
- 就差 0x20 呢?
- 怎麼那麼寸呢?
- 轉化為2進制之後
- 恰好是1位(bit)
- 這是偶然的嗎?
ASCII 碼表趣事
- 其實最初相差的并不是 0x20
- 之前 ibm 的 EBCDIC 編碼也是這樣的
- 也相差一個2進制位
- EBCDIC問題是字母不連續
- i、j之間不直接相連
- EBCDIC最終被ascii所淘汰
ASCII
- ASCII字母是連續的
- 而且大小寫字母間
- 相差正好是 1個 二進制位
- 對應 b6 這個位
- 那為什麼要差 1個 二進制位 呢?
- 有了這種對應關系之後
- 做大小寫不敏感的字元串查找就快多了
- 這個 0x20 發生在 1963 年 5 月
- The X3.2.4 task group voted its approval for the change to ASCII at its May 1963 meeting.
- Locating the lowercase letters in columns 6 and 7 caused the characters to differ in bit pattern from the upper case by a single bit, which simplified case-insensitive character matching and the construction of keyboards and printers.
- 當時的目的是
- 降低大小寫不敏感字元串比對的難度
- 降低打字機鍵盤的構造成本
- 如果搜尋中遇到的是小寫字母
- 修改1位之後
- 小寫就都變成大寫
- 不用查找對應關系表比對
- 然後再觀察全大寫的情況下是否比對
- 這就是大小寫字母的情況
- 0x41-0x5A這個範圍是大寫字母
- 0x61-0x7A這個範圍是小寫字母
- 除了大小寫字母之外
- 數字字元又是如何表示的呢?
ASCII 碼表範圍
- 0x30-0x39這個範圍是數字
- 數字的編碼減去0x30正好得到數字本身
- 後四位剛好是BCD編碼模式
- Binary-Coded Decimal
- 我們再來看看 ASCII 除了字母和數字還有什麼?
各種符号
- 各種符号是不連續的
- 穿插在數字、字母周圍
- sp 其實就是space(空格)
- 表格最左邊是什麼呢?
ASCII
- 0x20-0x7F 之間有各種真實字元
- 0x00-0x1F 之間的東西是什麼?
- 前兩列都是對應多個字元的
- 具體含義目前還不知道
- ASCII中的字元本來英語裡就有
- 但是字元是英文字元、數字和标點
- 怎麼編碼的呢?
ASCII由來
- ASCII碼是由電報代碼發展而來的
- 由貝爾資料服務公司推廣
- 電報碼不是摩斯電碼嗎?
摩斯電碼
- 更早之前确實是摩斯電碼
- 下圖是他的編碼表
- 分成長和短兩種信号,就是嘀和嗒
- 《oeasy 教您玩轉電路基礎》第 18 話 裡面有介紹
- 歡迎您有機會來看看oeasy電學、科學史那幾個系列
- 還記得encode/decode中的code麼?
- 曾經一度指的就是各種電報編碼彙編
- 後來統一到摩斯電碼
摩斯電碼通信規則
- 下圖是他的通信規則
- 三個斷确認本字元結束了
- 三個斷就是字元之間的分隔符
- 錄入狀态并不是 0、1 兩種狀态
- 而是長、短、暫停三種狀态
- 編碼的原則是什麼呢?
效率問題
- 編碼的規則是常用的字元點選次數少
- 按照字元出現機率配置設定對應點選數量
- T、E 出現頻率最高
- 是以用一次點選電鍵的數量
- 本質上是一棵霍夫曼樹
- 當時發射和接收全靠人
- 什麼叫長、什麼叫短、什麼叫斷
- 發送者控制發報速度
- 接收者跟着這個發報速度
- 現查表是來不及的
- 需要熟悉
- 摩斯電碼碼表
- 常用縮寫
- 這摩斯電碼是3進制的編碼方式
- 怎麼變成ascii這種0101的二進制編碼的呢?
總結
- ASCII 由這樣幾類字元構成
- 英文大寫字元
- 英文小寫字元
- 數字
- 符号
- 電報時代對于英文、數字的編碼
- 使用的是摩斯電碼
- 這摩斯電碼是3進制的編碼方式
- 長短空
- 怎麼演化成ascii這種0101的二進制編碼的呢?
- 下次再說
- 藍橋->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