ASCII 码表
回顾上次内容
-
通过 help()能够从 python 命令行模式进入到帮忙模式
- 通过 q 退出
-
ord(c)和 chr(i)
- 这是俩函数
-
这俩是一对,相辅相成的
ord
通过字符找到对应的数字chr
通过数字找到对应的字符
字符
的实质是数字
-
Python 外面的字符对应着一些数字
a
对应 97b
对应 98c
对应 99
- 可是,为什么是这样的对应关系,谁规定的,必须的么?🤔
小写字母
# 输入 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=",")
- 咱们先把 0 -127 挨牌儿捋一遍
- 而后如何找到数字对应的字符呢?
对应字符
- 通过数字找到对应的字符是 chr
for i in range(0,128):
print(hex(i),chr(i),sep=":",end=" ")
-
print(hex(i),chr(i),sep=”:”,end=” “)
-
hex(i)
- 输入 i 的十六进制状态
-
chr(i)
- 输入 i 的字符状态
-
sep=’:’
- 分隔符为冒号
-
end=” “
- 完结时输入 3 个空格
-
- 后果如何呢?
后果
- 这不是很参差啊
- 为什么在 0xa-0xc 如同换行很忽然
- 前面能够看到字符和序号一一对应的关系
- 不过不是很明确
- 有什么形式能够看起来更明确么?
装置 ASCII
sudo apt install ascii
- Dec 对应的是 10 进制数
- Hex 对应的是 16 进制数
- 前面的是具体字符
-
字符包含
- 管制
- 符号
- 英文大小写字母
- 这样就把各种字符和一个二进制数字对应起来了
- 这个 ASCII 什么时候开始有的呢?
ASCII 码表
-
1967 年的时候就有了最后这个 ASCII 码表🔡
-
过后计算机用高电平和低电平别离示意 0 和 1
- 实际上计算机中所有的数据都是 0 和 1
- 这建设起了
字符
和二进制数
的映射关系
-
-
字符
和二进制数
的映射关系
如果不统一- 面对同一个二进制数 01010101
- 就会映射到不同的字符
- 人们看到不同的字符就认为是乱码
-
过后美国的工程师定义了一套编码规定
-
ASCII
A
mericanS
tandardC
ode forI
nformationI
nterchange
- 美国信息替换规范代码
-
由来
-
这规范是美国信息替换规范代码是由美国国家标准学会制订的
- (American National Standard Institute , ANSI)
- 最后是美国规范
-
起初是国际标准化组织定为国际标准
- (International Organization for Standardization, ISO)
- 称为 ISO 646 规范
-
最初一次更新则是在 1986 年
- 到目前为止共定义了 128 个字符
解码 ASCII
-
咱们找到小写的
a
-
先向上找到
110
- 这是他的
765
位 - 高三位
- 这是他的
-
再向左找到
0001
- 这是他的
4321
位 - 第四位
- 这是他的
- 在后面加一个
0
- 失去(
01100001
)2 进制
- 对应着(
97
)10 进制数
- 也就是(
0x61
)16 进制数
- 刚好对应一个字节
-
对应关系
-
1 个 字节 byte
- 正好 8 个 bit 位
- 相当于 2 位 16 进制数
- 16 进制数 更容易读出
- 十六进制数很适宜输入字节状态
- 听起来找到了字符和字节状态之间的映射对应关系
- 咱们能在游乐场上验证一下吗?
游乐场
- 进入 python3 帮忙模式
-
咱们能够查问 hex
- hex 对应 hexadicimal 十六进制
- help(hex)
入手
# 失去 a 的序号
ord("a")
#输入 97 对应的 16 进制模式
hex(97)
#找到 a 对应的 16 进制模式数字对应的字符
hex(ord("a"))
-
0x61
就是十六进制的61
0x
是十六进制的前缀标记
- 可是为什么 16 进制应用
0x
作为前缀?
0x 前缀
-
x 的起源
- 0x 的 x 是取自 hex 的 x
-
0 的起源
- 变量名结尾不许是数字
- 0 结尾必定是数字
- 但失常状况下写数字不会用 0 结尾
- 这保障 0 结尾很容易和 10 进制辨别开
-
在 C 语言之前的 B 语言用 0 结尾示意 8 进制
-
C 语言继承了相似设定
- 0 结尾示意数字
- 0x 结尾示意 16 进制数
-
-
python 也持续继承
- 字符对应着数字
- 数字也能够转化为字符
-
字符和二进制数之间的关系其实是
- 编码 encode
- 解码 decode
编码解码
-
编码
- 就是用预先规定的办法将文字、数字、其它对象编成数码
- 将信息、数据转换成规定的电脉冲信号
- 简略来说就是给大白菜编个号
-
解码是编码的逆过程
- 用特定办法,把数码还原成它所代表的内容
- 将电脉冲信号、光信号、无线电波等转换成它所代表的信息、数据等的过程
- 简略说就是扫条码晓得这个是一个大白菜并晓得价格等
- 咱们用 python 试试编码解码
encode 和 decode
- str(字符串)
'a'
encode(编码)之后 为 bytes(字节序列)b'\x61'
- bytes(字节序列)
b'\x61'
decode(解码)之后为 为 str(字符串)'a'
- 编码(encode) 和解码(decode) 互为逆运算
-
很像
- 字符 (chr) 和 序号(ord)
编码解码
- 能够先编码再解码
- 也能够先解码再编码
- 绕来绕去
- 也没做神马😁
- 把握这个根底是最起码
- 基本功要练得硬桥硬马
- 实战方能操之过急
- 否则当前各种乱码
- 字节除了用十六进制显示之外
- 还能够用二进制显示么?
bin(number)
- 这次咱们来试试把数字转化为二进制模式
-
查问 bin
- bin 对应 binary 二进制
入手
# 失去 a 的序号
ord("a")
#输入 97 对应的 16 进制模式
bin(97)
#找到 a 对应的十六进制模式
bin(ord("a"))
0b1100001
是二进制数1100001
-
0b
是 2 进制数的前缀标记- 正如
0x
是 16 进制数的前缀标记
- 正如
和 ASCII 表比照
- 验证胜利
- 这充分证明了咱们用的的确是 ASCII 表!!!👏👏
- 废话!🦧
- 咱们会用 hex、bin 把 10 进制数转化为八进制、二进制模式
- 能把其余进制转化回十进制么?
其余进制 转化为回 10 进制 int(number)
- 用的是 int
- 这个 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.
-
如果是大写字母
- 批改 1 位之后,都变成小写字母
- 而后间接查找就好了
ASCII 码表范畴
0x41-0x5A
这个范畴是大写字母0x61-0x7A
这个范畴是小写字母-
0x30-0x39
这个范畴是数字- 数字的编码减去
0x30
正好失去数字自身
- 数字的编码减去
- 咱们再来看看 ASCII
ASCII
0x20-0x7F
之间有各种符号-
0x00-0x1F
之间的货色是什么?- 目前还不晓得
- 兴许有一天能够进行进一步地摸索
-
能够必定都是
- 很多字符来自与更早之前的摩斯电码
更早之前的摩斯电码
-
ASCII 也不是从无到有的
- 在 ASCII 之前就有摩斯电码
- 也是一种编码方法
- 《oeasy 教您玩转电路根底》第 18 话介绍过
-
下图是他的编码表
- 分成长和短两种信号,就是嘀和嗒
摩斯电码通信规定
- 下图是他的通信规定
- 三个断确认本字符完结了
- 三个断也就是字符之间的分隔符
- 录入状态并不是 0、1 两种状态
- 而是长、短、暂停三种状态
- 为什么这样编码呢?
效率问题
-
编码的规定是罕用的字符点击次数少
-
依照字符呈现概率调配对应点击数量
T
、E
呈现频率最高- 所以用一次点击电键的数量
- 实质上是一棵霍夫曼树
-
-
过后齐全由人进行发射和接管
- 每个人发送数据的速度是不固定的
- 每个人接收数据的速度取决于发送人的发送速度
- 现查表是来不及的
- 须要相熟编码表和罕用缩写
-
这就是晚期应用电来进行编码的过程
- 咱们当初回到 ASCII 码
- 最初咱们来总结一下
总结
-
数制能够转化
- bin(n)能够把数字转化为
2 进制
- hex(n)能够把数字转化为
16 进制
- int(n)能够把数字转化为
10 进制
- bin(n)能够把数字转化为
-
编码和解码能够转化
- encode 编码
- decode 解码
-
ASCII 码表范畴
0x41-0x5A
这个范畴是大
写字母0x61-0x7A
这个范畴是小
写字母-
0x30-0x39
这个范畴是数字
- 数字的编码减去
0x30
正好失去数字自身
- 数字的编码减去
0x20-0x7F
之间有各种符号0x00-0x1F
之间的货色是什么?🤔
- 咱们下次再说