ASCII 码表
回忆上次内容
小写字母
#输出a,b,c
ord("a")
ord("b")
ord("c")
#输出z-a的数字差距,相对序号
ord("z")-ord("a")
#输出a的相对序号
ord("a")-ord("a")
-
a、b、c 这些字符是挨着的
-
正好从0到25,总共26个数字????
-
对应数字也是挨着的
编码规律
-
从 a-z 应该都是挨着的
-
26 个英文字母之间,数值差距是 25,说明都是挨着的
-
为什么是从 97 开始?
-
应该还有别的字符
-
除了小写字母之外、大写字母、数字、符号他们都是如何的分布的呢?
-
我想把所有 ASCII 字符 0-127 全都打出来
-
可以么?
遍历范围
for i in range(0,128):
print(i,end=",")
对应字符
for i in range(0,128):
print(hex(i),chr(i),sep=":",end=" ")
结果
-
这不是很整齐啊
-
为什么在 0xa-0xc 好像换行很突然
-
后面可以看到字符和序号一一对应的关系
-
不过不是很明确
-
有什么方式可以看起来更明确么?
安装 ASCII
sudo apt install ascii
-
Dec 对应的是 10 进制数
-
Hex 对应的是 16 进制数
-
后面的是具体字符
-
字符包括
-
这样就把各种字符和一个二进制数字对应起来了
ASCII 码表
由来
解码 ASCII
-
我们找到小写的a
-
先向上找到110
-
再向左找到0001
-
在前面加一个0
-
得到(01100001)2进制
-
对应着(97)10进制数
-
也就是(0x61)16进制数
-
刚好对应一个字节
对应关系
-
1 个 字节 byte
-
正好 8 个 bit 位
-
相当于 2 位 16 进制数
-
16 进制数 更容易读出
-
十六进制数很适合输出字节状态
-
听起来找到了字符和字节状态之间的映射对应关系
-
我们能在游乐场上验证一下吗?
游乐场
-
进入 python3 帮助模式
-
我们可以查询 hex
-
help(hex)
动手
#得到a的序号
ord("a")
#输出97对应的16进制形式
hex(97)
#找到a对应的16进制形式数字对应的字符
hex(ord("a"))
0x 前缀
-
0 的起源
-
python 也继续继承
-
字符对应着数字
-
数字也可以转化为字符
-
字符和二进制数之间的关系其实是
编码解码
-
编码
-
就是用预先规定的方法将文字、数字、其它对象编成数码
-
将信息、数据转换成规定的电脉冲信号
-
简单来说就是给大白菜编个号
-
解码是编码的逆过程
-
用特定方法,把数码还原成它所代表的内容
-
将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程
-
简单说就是扫条码知道这个是一个大白菜并知道价格等
encode和decode
-
str(字符串)'a' encode(编码)之后 为 bytes(字节序列) b'\x61'
-
bytes(字节序列)b'\x61' decode(解码)之后为 为 str(字符串)'a'
-
编码(encode) 和解码(decode) 互为逆运算
-
很像
编码解码
-
可以先编码再解码
-
也可以先解码再编码
-
绕来绕去
-
也没做神马????
-
掌握这个基础是最起码
-
基本功要练得硬桥硬马
-
实战方能稳扎稳打
-
否则以后各种乱码
-
字节除了用十六进制显示之外
-
还可以用二进制显示么?
bin(number)
-
这次我们来试试把数字转化为二进制形式
-
查询 bin
动手
#得到a的序号
ord("a")
#输出97对应的16进制形式
bin(97)
#找到a对应的十六进制形式
bin(ord("a"))
-
0b1100001是二进制数1100001
-
0b是 2 进制数的前缀标志
和 ASCII 表对比
-
验证成功
-
这充分证明了我们用的确实是 ASCII 表!!!????????
-
废话!????
-
我们会用 hex、bin 把 10 进制数转化为八进制、二进制形式
-
能把其他进制转化回十进制么?
其他进制 转化为回 10进制 int(number)
-
这个 int 什么来历?
-
我们 help()里面去找找
大小字母差值
-
0x41-0x5A这个范围是大写字母
-
0x61-0x7A这个范围是小写字母
#输出a的ASCII吗
ord("a")
#输出A的ASCII吗
ord("A")
#输出大小写之差
ord("a")-ord("A")
#差值的16进制形式
hex(ord("a")-ord("A"))
#差值的2进制形式
bin(ord("a")-ord("A"))
-
大写字母和小写字母相差(32)10进制
-
正好是(0x20)16进制
-
为什么不多不少
-
就差 0x20 呢?
-
怎么那么寸呢?????
ASCII 码表趣事
-
其实最初不是相差 0x20
-
这个 0x20 正好是一个二进制位
-
对应 b6 这个位
-
之前 ibm 的 EBCDIC 编码并不是这样的
-
那为什么要改成这样子呢?
-
有了这种对应关系之后
-
做大小写不敏感的字符串查找就快多了
-
这个 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.
-
如果是大写字母
ASCII 码表范围
-
0x41-0x5A这个范围是大写字母
-
0x61-0x7A这个范围是小写字母
-
0x30-0x39这个范围是数字
ASCII
-
0x20-0x7F之间有各种符号
-
0x00-0x1F之间的东西是什么?
更早之前的摩斯电码
-
ASCII 也不是从无到有的
-
在 ASCII 之前就有摩斯电码
-
也是一种编码方法
-
《oeasy 教您玩转电路基础》第 18 话介绍过
-
下图是他的编码表
摩斯电码通信规则
-
下图是他的通信规则
-
三个断确认本字符结束了
-
三个断也就是字符之间的分隔符
-
录入状态并不是 0、1 两种状态
-
而是长、短、暂停三种状态
效率问题
-
编码的规则是常用的字符点击次数少
-
按照字符出现概率分配对应点击数量
-
本质上是一棵霍夫曼树
-
当时完全由人进行发射和接收
-
每个人发送数据的速度是不固定的
-
每个人接收数据的速度取决于发送人的发送速度
-
现查表是来不及的
-
需要熟悉编码表和常用缩写
-
这就是早期使用电来进行编码的过程
-
最后我们来总结一下
总结
-
数制可以转化
-
bin(n)可以把数字转化为 2进制
-
hex(n)可以把数字转化为 16进制
-
int(n)可以把数字转化为 10进制
-
编码和解码可以转化
-
ASCII 码表范围
-
0x41-0x5A 这个范围是 大 写字母
-
0x61-0x7A 这个范围是 小 写字母
-
0x30-0x39 这个范围是 数字
-
0x20-0x7F之间有各种符号
-
0x00-0x1F之间的东西是什么?????
-
我们下次再说
阅读(538) | 评论(0) | 转发(0) |