Skip to main content

moregeek program

[oeasy]python0019_ 打包和解包_struct_pack_unpack_overmind1980的博客-多极客编程

打包和解包

回忆上次内容

  • ASCII 由这样几类字符构成
  • 英文大写字符
  • 英文小写字符
  • 数字
  • 符号
  • 电报时代对于英文、数字的编码
  • 使用的是摩斯电码

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包

  • 这摩斯电码是3进制的编码方式
  • 长短空
  • 怎么演化成ascii这种0101的二进制编码的呢?🤔

回到 ASCII 码

  • 电报传过来的信号需要记录下来
  • 于是有了电传打字机(tele-typewriter)
  • 电传打字机需要统一的编码字母和数字
  • ASCII的第一个商业用途
  • 是作为一个七位电传打字机(tele-typewriter)代码

[oeasy]python0019_ 打包和解包_struct_pack_unpack_解包_02

  • 要把滴、答、停的电报信号
  • 变成0和1的二进制信号

ASCII的演化(evolve)

  • 1960年10月6日
  • 美国标准协会(ASA)X3的首次会议
  • ASCII标准的工作开始了
  • 美国标准协会
  • 现为美国国家标准协会
  • American National Standards Institute
  • 简称ANSI
  • 开始敲定ASCII具体编码

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_03

  • 贝尔公司主要经营电报电话

编码来源

  • 第一次(ASA X3.4-1963)就明确
  • 大小写字母之间只差一个位
  • 这很重要

[oeasy]python0019_ 打包和解包_struct_pack_unpack_解包_04

  • 否则错误编码一旦成为标准
  • 所有应用这种错误编码的文件
  • 就都废掉了
  • 我想把所有 ASCII 字符 0-127 全都打出来
  • 可以么?

​回忆show.py​

for n in range(0xff):
print(chr(n),end="")
if n % 16 == 0:
print()
  • 确实可以出来

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包_05

  • 这输出靠的是
  • 把序号转化成字符的函数
  • chr
  • 但是没有看到0
  • 理论上在1之前
  • 仿佛被黑暗森林所吞没
  • 我能否将字节解码(decode)来干这个事?

struct

  • 首先是要获得从0到127的字节状态
  • struct 是一个包(module)
  • 导入struct包

[oeasy]python0019_ 打包和解包_struct_pack_unpack_解包_06

  • struct是结构的意思
  • 来自于c里面常用类型的存储结构
  • 这个struct怎么用呢?

pack

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_07

  • 把数字变成字节的形态
  • 把0x61这个数字变成字节的形态

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包_08

  • "a" 不是字符吗?🤔
  • 怎么成了字节了?

字节表示法

  • 注意细节

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包_09

  • 注意"a"前面还有一个b
  • "a"是字符
  • b"a" 是字节

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_10

  • 这两类型完全不同
  • 字节b"a"是什么呢?

字节形态

  • 字节状态可以用两个16进制数来表示
  • b"a"
  • 相当于b"\x61"

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包_11

  • b"a" 和 b"\x61" 是同样的一个字节
  • 就是字符"a"在字节里的样子

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_12

  • 为了清楚起见
  • 把b"\x61"表示为b"a"
  • 这样也就直接看到了字符😂
  • 刚好ord("a") 就是 0x61
  • 如何理解struct.pack呢?

封包pack

  • 按要求把东西封进规定的封装里面

[oeasy]python0019_ 打包和解包_struct_pack_unpack_解包_13

  • 把数字封在1个Byte里面
  • 观察他的字节状态

遍历

import struct
for n in range(0,128):
b = struct.pack("b",n)
print(b,end=",")
  • 把从0-127的数字都封到字节里面

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_14

  • 可以把数字转化成字节状态
  • 然后可以再把字节解码了

遍历结果

  • 好多的字节呀~😄

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_15

  • 从字节状态可以看到已经有
  • 0、1、2、3
  • 这里很明显能看到0
  • 还有0前面的一堆符号
  • A、B、C
  • a、b、c
  • 还有
  • \r、\n、\t
  • 这是啥意思?🤔
  • 怎么还能有两个字符呢?
  • 不管他
  • 先加上换行

换行

[oeasy]python0019_ 打包和解包_struct_pack_unpack_解包_16

  • 从0数到7
  • 换1行
  • 再从0数到7

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_17

  • 隐约看到了ascii码的结构
  • 我不想看字节状态呢
  • 我想看字符状态
  • 需要对字节状态解码(decode)
  • 也就是解包
  • struct.unpack

解包

  • 这又是一圈
  • pack
  • unpack

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_18

  • 解包出来是序号
  • 先把0-127的数字都变成字节

封包再解包

import struct
for 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()
  • 依然要面对黑暗森林

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_19

封包再解码

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()
  • 运行一下
  • 上面那片依然是全黑的?

[oeasy]python0019_ 打包和解包_struct_pack_unpack_封包_20

  • 和原来chr方法得到的结果差不多
  • 但是没有看到字符0
  • 仿佛被上面那片黑暗森林所吞没
  • 这可真可怕!
  • 我们先去总结一下吧

总结

  • struct包可以让我们使用封包格式
  • 把数字封包到字节里
  • pack函数就是封包
  • unpack函数就是解封
  • 我们通过封到不同字节的数字
  • 遍历了一次ascii码

[oeasy]python0019_ 打包和解包_struct_pack_unpack_python_21

  • 还是有那片黑色的区域
  • 好像是一片黑暗森林!
  • 那里面到底有些什么秘密?🤔

©著作权归作者所有:来自51CTO博客作者overmind1980的原创作品,请联系作者获取转载授权,否则将追究法律责任

python文件操作知多少?_迷彩编程的博客-多极客编程

前言对于文件大家应该都不陌生,但是在接触计算机之前,通常将文件定义为内容的载体.如公文书信或者有关政策理论方面的文章.计算机文件也一样,而且在计算机中文件的类型更加丰富多样,用途广泛.有的是用来支撑程序运行的,有的只是单纯用于数据存储,文件使用文件扩展名区分文件类型,比如我们常用图片格式,有.jpg/.png/.gif,记事本保存的文字.txt,办公文档类型.docx/.pptx/.xlsx等.它

python第三方库管理pip和conda_domi+1的博客-多极客编程

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 🍎个人主页:算法工程师的学习日志在本机开发完程序后,需要把程序移植到服务器之类的目标机上运行,或者分发给其余同事,经常会遇到第三方库管理,或者是不同项目之间用到的第三方库版本不一致,例如有时候需要tensorflow 1版本,有的时候希望用最新的2.3版本,这样导致了运行环境的管理复杂度,对于第三方库管理推荐通过

linux python web 离线部署非 docker部署_胡六六的博客-多极客编程

实际项目中,避免不了遇到私有化部署。不能在线安装有些问题,项目中各种包需要很多依赖非常痛苦。如果,项目支持容器化部署这个是最简单的。以下介绍离线安装 Python包、包相关deb依赖 安装环境 Debian 11 安装 python 离线和安装 pip wheel --wheel-dir=生成路径 -r requirments.txt # 离线 pip install --no-index --f

python异常知多少_迷彩编程的博客-多极客编程

我们在编写程序的时候或多或少都出现过异常,也许是不小心,也可能是逻辑错误亦或是程序以外的问题,比如环境的问题,不管是什么原因,异常是我们不希望看到的.接下来,我们就什么是异常,遇到异常如何解决展开唠唠1.什么是异常异常会让我们的程序跳出正常的运行,异常给我们带来的损失,不容小觑.我们经常听到的是机器的异常.比如工厂流水线上的机器设备,某个零件出问题了,机器不能正常运行或者生产流程错乱;快递分拣设备

selenium4+python3系列(八) - cookie、截图、单选框及复选框处理、富文本框、日历控件操作_久曲健的博客-多极客编程

我所在的城市昨天出了近20+的阳性案例,但这丝毫没有 “影响” 到996的工作时间,当然,也没有影响到我想继续更新文章的决心。 一、cookie常用操作入门 上一篇有写过关于cookie的实战案例,个人觉得没有很好地照顾到入门同学的感受,所以就又更新了关于cookie的基本使用操作。 1、获取所有cookie信息 示例代码: cookies = driver.get_cookies() for c

[oeasy]python0021_python虚拟机的位置_可执行文件_转化为字节形态_overmind1980的博客-多极客编程

程序本质回忆上次内容​​\n​​ 就是换行 他对应着 ​​ascii​​​ 字符的代码是(​​10​​​)​​10进制​​他的英文是 LF,意思是​​Line Feed​​我们可以在《安徒生童话》中找到每个字符对应的字节形态不光txt文件是文件我们的python游乐场本质上也是一个二进制可执行的文件这个文件在哪?我们可以读懂这个可执行文件吗?🤔​​python3​​ 到底是个啥?which pyt

harmonyos arkts 本地库&三方库的用法_鸿蒙社区的博客-多极客编程

项目介绍 项目内容: 自定义基础组件和容器组件、依赖库概念、本地依赖库的创建和引用、三方库的引用。 工具版本: DevEco Studio 3.1 Canary1 SDK版本: 3.2.1.4(API Version 9 Canary1)(Stage模型) 本项目基于HarmonyOS的ArkUI框架TS扩展的声明式开发范式,关于语法和概念直接看官网官方文档地址:基于TS扩展的声明式开发范式, 效

谈云服务,那不得不谈这个技术_周杰伦本人的博客-多极客编程

谈云服务,那不得不谈这个技术 坚持原创,写好每一篇文章 上篇文章我们说到docker的出现让容器即服务变成了可能并日趋流行,然而docker部署的服务越来越多以后,容器的管理就成为了问题,kubernetes就是用来解决这个问题的。如果没有kubernetes,我相信,容器肯定混乱不堪,并且难以维护。kubernetes可以实现容器的自动部署,自动扩缩容和管理容器。所以如果要谈云服务的,kub

一文带你吃透java中的继承_mb6353c9b8a50b6的博客-多极客编程

继承 继承的概念 面向对象的三大特征:封装性、继承性、多态性。 继承是多态的前提,如果没有继承,就没有多态。 继承关系当中的特点: 1.子类可以拥有父类的“内容”。 2.子类还可以拥有自己的专有内容。 父类也可以叫基类、超类 。 子类也可以叫派生类。 继承的格式 在继承的关系中,“子类就是一个父类”。也就是说,子类可以被当做父类看待。 定义父类的格式:(一个普通的类定义) pub

entityutils mapstruct beancopier 数据实体类转换工具 do bo vo dto 附视频_赛先生和泰先生的博客-多极客编程

一、序言 在实际项目开发过程中,总有数据实体类互相转换的需求,DO、BO、VO、DTO等数据模型转换经常发生。今天推荐几个好用的实体类转换工具,分别是EntityUtils MapStruct BeanCopier ,并且给出使用的案例。需要说明的是,本文有配套视频讲解。 下面分别讲解这3种工具的使用。 二、实战编码 (一)EntityUtils 1、引入依赖 学习工具包源代码的朋友,请看这里。

聊一聊装饰者模式_知了一笑的博客-多极客编程

是你,还是你,一切都有你!—— 装饰者模式 一、概述 装饰者模式(Decorator Pattern)允许向一个现有的对象扩展新的功能,同时不改变其结构。主要解决直接继承下因功能的不断横向扩展导致子类膨胀的问题,无需考虑子类的维护。 装饰者模式有4种角色: 抽象构件角色(Component):具体构件类和抽象装饰者类的共同父类。 具体构件角色(ConcreteComponent):抽象构件的

matlab simulink常见问题和数据导出到变量区_domi+1的博客-多极客编程

✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。 🍎个人主页:算法工程师的学习日志1、simulink常见问题问题1:scope波形图没有或者看不清解决方案:你要使图像自适应,点击scope里面的这个按钮问题2:运行代码出现下面提示框解决方案:这是系统提示你的文件不在matlab的根目录下面。这个为matlab的根目录。你要把对应的代码、模型之类的文件放在这个文