【高级教程】字节级数据处理:struct

本文详细介绍了自定义网络通信协议ME的背景和设计思路,强调了数据安全的重要性。随后,文章重点讲解了Python的struct模块,包括struct解决的问题、格式字符串的使用以及struct在数据封装和解封装中的应用。通过实例展示了struct如何处理字节级数据,如ME协议数据包的构造和解析,进一步解释了字节序、大小和对齐的概念。
摘要由CSDN通过智能技术生成

目录

1、缘起:文本传输协议ME

1.1数据安全

1.2 一个简单的自定义网络通信协议ME

1.2.1 一个简单的基于ME的网络通信程序

1.2.2 ME协议及核心代码

2、struct

2.1 struct解决的问题

2.2 struct解决问题基础

2.2.1 函数

2.2.2 数据类型

3、struct格式字符串

3.1 字节序、大小与对齐

3.2 格式字符串fmt

3.2.1 格式字符与数据类型

3.2.2 特殊事项

3.2.3 格式字符计数

3.3 struct应用示例

3.3.1 100字节ME包

3.3.2 3个整数

3.3.3 解封装到对象

3.3.4 对齐与填充①

3.3.5 对齐与填充②


1、缘起:文本传输协议ME

1.1数据安全

在网络通信应用中,有时候要考虑业务数据安全,谁会希望自家机密级业务数据常常成为他人机器学习样本而导致辛辛苦苦摸索多年的核心业务/商业模式轻易地为人一朝所获呢?可以断言,业务的信息化程度越高,数据安全程度就应越高。

数据有多种属性,如公开数据、隐私数据。数据分等级,如802.11协议帧分管理帧、控制帧、数据帧;有授权对象,不是销售总监就不必看季度销售财报,不是主任就不必知晓主任级别文件内容——这种职场中严控得非常好的事务,在网络上当然不应逊色。对数据的管理,一般基于以数据属性为基础的数据模型。管理班级学生,如果是学生成绩管理,只须基于学号、课程号、分数,而每天几点几分进入学校(到校时间)与此无关。

那么如何加强数据安全?

最简单、成本最低的安全手段莫过于加密与自定义通信协议。建立一条独立的物理或逻辑通信路径当然可以,但成本大太多。

数据安全自然有其大道:不知道

“不知道”的含义指不知道目标、不知道数据和不知道意义

在公用网络上通信而不想数据被任何第三方捕获几乎是不可能的事,特别是自古以来咱自带势力意识(平台观),稍具规模组织也有着强烈情报意识,即是说,既有观念又有技术(钱),让他人看不到并不容易实现,那么,只能走另一途径:看到而不知道

PS:专利之路是一种路径,一种共赢之路,共赢之路有很多,未必一定得建立在窃取核心机密之上。当然也可以在他人的“心”上建立一套观念/心态,但我压根就不认为这能有多可靠(虽然网络上有很多心理、情感分析的优质内容输出视频,这说明网络仍是那片热心群众甚多且自带诸葛人设的网络,但经不起推敲的是,此类分析大多属于细节预先设定外加马后炮式的理想分析——对于很多人,能不能站到上帝视角是很大一回事,而很小一回事的及时从感知觉这种认知层面察觉到相关信息也要难倒一大批人——不过倒是强化了我的一种意识:凡事不能只分析事,也要分析人;再者,如我那篇代码调节中所述,客观虚拟性……)。当然也可以通过其他机制保证这条路只有自己能走而他人不行,但这得有实力且相对性脆弱或代价不小。

看到不知道无非三层含义:量多,加密,无认知。

量多,如二十万条记录,五百个画面等,当第三方“看到”的内容太多,在机器学习还未出模型前,人工分析不了;

加密,第三方“看到”的数据是明明白白且有条有理的乱码。加密仅仅是通过加密算法将原始数据(有意义数据)呈现为加密数据(无意义数据)吗?也不见得:变换一种数据呈现模式,同样实现“加密”效果

无认知,相当于甲和乙在一群日本学生中用法语聊得有滋有味。自定义通信协议就是一片“搜嘎”“索滴斯类”“撒油啦啦”中甲乙之间的一声“Bonjour”,即用不同的模式进行交流,或“沟通不同频”。量多与加密属于“无认知”的具体类别,但无认知范围更广,可指任何非常规模式。在通信模式未被识别之前,通信内容是保密的;而只要数据足够多,通信模式一定可被识别,所以,通信协议应够复杂、可变、可升级版本,保证模式被识别的时间大于模式更新周期。

1.2 一个简单的自定义网络通信协议ME

1.2.1 一个简单的基于ME的网络通信程序

我定义一个简单的文本传输协议ME,服务器与客服端通过ME协议进行文件传输。服务器与客户端通信很简单:客户端向服务器发送文件传输请求,服务器检查该请求,若可行则将对应文件传输给客户端。

主程序:

import threading,time
import server
import client
if __name__=="__main__":
    s=threading.Thread(target=server.main)
    c=threading.Thread(target=client.main,args=('server.txt',))
    s.start()
    time.sleep(2)
    c.start()

服务器:

客户端:

我设定请求的文件必须是utf-8编码或被utf-8编码兼容的文件。

1.2.2 ME协议及核心代码

ME工作在应用层,用于服务器和客户端间的文件传输与文件传输时的通信控制。

ME数据包格式:

Ver=1,ME版本号。

TLEN:实际数据长度。

Typ:ME数据包类型,DC=0代表通信控制包,DD=1代表通信数据包。

Seed:相对的数据首地址。

data:传输的数据。数据(单位:字节)以链式结构分散存放在data空间中。

ME数据包总长100字节,Ver、TLEN、Typ、Seed各占1字节,data占96字节。data中的数据采取“链式”存放方式,“指针”占一个字节,所以一次最多传送24个字符(全utf-8中文字符,实际上为支持存储空间分配管理,我设定一次传输15-20个字符),数据结束标记为0xFF。data中的非通信“空间”(无数据存放的位置)随机填充数据。下面是两个ME数据包内容输出示例。

1、内容为“test.txt”的通信控制包

ME协议下的“test.txt”:

b'\x01\x08\x00\x9c0\x02+]c\x18N\x1b\x13!\x0cH2]`PD\\Gr\rNQ^test.txt\xffnA";u\x10,\x18^5zC1\x0e\x7f[lZ\ry\x16\x05t\x11c\x1b!\x18A\x0e\x0e\x0c&m\x10Q9\x1co4e\x05\x05\x07$s4\x1e1\t/\\D\x15j1\n.\x1dJP`-'

网络输出:

①数据包捕获设置

C:\Users\cyx>windump -vv -A -i 2 ip host 192.168.1.104 and 192.168.1.1

②构造并发送数据包

③数据包捕获结果

2、内容为“how are you”的通信数据包

ME协议下的“how are you”:

b'\x01\x0b\x01\xda@r\xca\x1b\x00mKL\x1ar\x13A\x13ar?/w74>/i\x14y\xcfF"\\\x1d(n,\r*\x0bu\xff\x00Xo\xe2\x1c\n"D\x13=nVd"Q\\-eYd,Ha\x85\x1f\nUl/ \x9cYe\xc77;"o\xa8"nGyc1~t2h\xac)\x01W. \xc0w\xe0'

网络输出:

①数据包捕获设置

C:\Users\cyx>windump -vv -A -i 2 ip host 192.168.1.104 and 192.168.1.1

②构造并发送数据包

③数据包捕获结果

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值