show | version | enable_checker |
---|---|---|
step |
1.0 |
true |
- struct包
- 就是 封包格式
- 可以把数字 封包到 字节里
- pack函数 负责 封包
- unpack函数 负责 解包
- struct.pack/struct.unpack
- 是针对 数字 的编解码操作
- str.encode/str.decode
- 是针对字符的编解码操作
- 下次玩点什么呢?👊
- 我们首先了解了变量
- 可以变的量
- 怎么变呢?
- 可以直接赋值
- 可以通过键盘输入
- 可以通过随机算法赋值
- 也可以通过运算赋值
- 我们学过的运算就是加法运算
- 中间的是加法运算符
- 两边的是加法操作数
- 加法有两种运算
- 字符串加法
- 数字加法
- 除了加法之外有没有减法呢?
- 减法和加法很像
- 中间的是运算符
- 左右的是操作数
- 只支持数字的减法
- 不支持字符串的减法
- 从字节码的方面如何理解呢?
- python虚拟机有二进制减法的指令
- 除了 10 进制之外
- 还有各种形式的数字
- 都可以进行减法
- 回顾一下数制
- 0x 16 进制
- 0o 8 进制
- 0b 2 进制
- 进制只是表示方法不同
- 用几根手指头数苹果
- 不会因为手指多少而改变苹果的数量
- 上面这些数字其实都相等
- 对左右操作数变量进行赋值
- 内存里在变量名位置有了相应的值
- 使用 cpu 对于左右两个操作数进行减法运算
- 得到的值赋给 iResult
- 结果是零
- 看起来出错了
- 分析一下
- 随机数减法减出来的结果是 negative
- 也就是负的
- 再负那也得存在内存里
- 也得是 0101 的形式啊
- 查帮助
help(int.to_bytes)
- 查询 int 类 to_bytes 函数的帮助手册
- 我们分析一下函数参数
- 第一个是长度
- 说明要用几个字节
- 1、2还是4
- 第二个是字节序
- 要选 big 还是 little
- big 就是大端字节序
- little 就是小端字节序
- 第三个参数 signed 是正负符号位
- 默认是 False
- 假的
- 那我给他改成 True
- 变成有符号
- 默认是 False
- 我们给python参数
- python 给我们 具体的字节状态
- 这里的字节状态指的是数字的一种存储形式
- 比如 6
- 字节数1也可以2也可以
- 符号可以全正也可以有正有负
- 可以大端字节序也可以小端字节序
- 都可以
- 具体怎么存的是int 这个类(class)具体实现的
- 但我们可以用各种形式表示这个整数
- 但如果想表示-1
- 就不能用无符号
- 只能用有符号
- 看起来确实是可以得到-1 的二进制形式了
- 这两个字节
- 怎么表示
- 什么是负
- 什么是正
- 而且这个 to_bytes 每次都要输入"big"或者"little"
- 有点麻烦啊
- 有什么简单方法吗?
- 首先引入 struct 这个 module
- 我们看一下这个函数 pack
- 把数字打包
- 我们可以看到
- 这个数字存储
- 其实用的是 little-endian
- 不过两个字节毕竟还是多
- 我可以简化成
- 1 个字节么?
help(struct.pack)
- 更多细节还得看 struct 这个 module
help(struct)
- 可以看到
<>
可以区分 大小端字节序
-
还可以看到具体的数据类型
- h
- signed short
- 有符号 2字节
- signed short
- b
- signed char
- 有符号 1字节
- signed char
- B
- unsigned char
- 无符号 1字节
- unsigned char
- h
-
不过还不是很明确
- 可以看到具体哪个有多少字节么?
-
docs.python.org
- python 的类型和 C 是一一对应的
- 我们看不到具体的类型名
- 是因为 python 封装得比较好
- 但内部肯定还是这些东西
- 有封装(pack)就有解封(unpack)
- 有打包就有拆包
- 就像有加就有减一样
- 去 struct 查找一下
- 我们这次学习了减法
- 数字可以用相减
- 减号是运算符
- 被减数和减数是操作数
- 操作数无论是长短(1,2,4,8)
- 都可以 pack 查看二进制编码情况
- 也可以 unpack 解回整数形式
- 减法没有交换律
- 可能结果是零
- 也可能是负数
- 不过负数具体是怎么用二进制表示的呢?🤪
- 下次再说 👋