wxpython制作解包工具(三)

本文介绍了解包工具第二版(v0.1.0)的更新内容,包括报文格式写入XML配置文件以方便后期修改及优化工具功能。详细解释了如何读取XML配置文件及对不同类型的报文进行解析的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天完成解包工具第二版(v0.1.0),相对于最初版本,有两个变化

1:报文格式写入XML配置文件,便于后期修改

2:优化工具功能,删除添加报文功能

先上界面,整体布局与初版变化较小,删除报文选择窗口与对应的图标:


再说逻辑:

第一步读取XML配置文件。XML文件中需要提供的信息包括报文的长度、名称和解释,并且按照顺序排序。在读取XML文件时,使用字典和列表存储报文结构信息,每个字典的Key为报文包的名称,而字典的Value为长度、名称和解释组成的列表,程序启动后首先读取XML配置文件,如果文件错误,程序将提示错误。XML文件格式和读取函数如下:

<packet name="PacketHead">
	<Var id = "0">
		<Len>1</Len>
		<Name>Q_UPDOWN</Name>
		<Mean>信息传送的方向 (0=车对地,1=地对车)</Mean>
	</Var>
	<Var id = "1">
		<Len>7</Len>
		<Name>M_VERSION</Name>
		<Mean>语言/代码版本编号 (0010000=V1.0)</Mean>
	</Var>
	<Var id = "2">
		<Len>1</Len>
		<Name>Q_MEDIA</Name>
		<Mean>信息传输媒介 (0=应答器,1=环线)</Mean>
	</Var>
	<Var id = "3">
		<Len>3</Len>
		<Name>N_PIG</Name>
		<Mean>本应答器在应答器组中的位置 (000=1,111=8)</Mean>
	</Var>
</packet>


第二步,解析报文。这里将报文分成四类,分别处理。

第一类:顺序执行类,包括ETCS16、ETCS42、ETCS45、ETCS131、ETCS132、ETCS254、CTCS3、CTCS4、CTCS5

此类报文只需顺序读取报文结构后填入解析信息,执行代码如下:

第二类:循环执行类,包括ETCS21、ETCS27、CTCS1、CTCS2

此类报文在执行时需要寻找关键字“N_ITER”,根据解析出来的值进行循环解析,代码如下:


第三类:判断+循环执行类,包括ETCS5、ETCS41、ETCS46、ETCS68、ETCS72、ETCS79

此类报文在执行时需要除了寻找决定循环次数关键字的“N_ITER”外,还需要针对不同的包寻找各自的关键字。

举个栗子,在解析ETCS68包时,当“Q_TRACKINIT”值为1时,则解析"D_TRACKINIT"值,并跳过接下来的三个字段“D_TRACKCOND”、“L_TRACKCOND”和"M_TRACKCOND";当“Q_TRACKINIT”值为0时,则跳过"D_TRACKINIT",而解析接下来三个字段的值。此时就需要加入关键字判断函数来决定跳过的步长。代码如下:


第四类:也就是中文包ETCS44包的处理,其中包含了顺序执行(CTCS3、CTCS4、CTCS5)和循环执行(CTCS1、CTCS2)

这里需要做的只是判断包名,再调用相应函数。



### BUAA 面向对象编程 第二单元 课程资料概述 #### 占位类的设计应用 为了防止电梯系统的双轿厢发生碰撞,引入了 `Occupied` 类作为辅助工具[^1]。该类的功能类似于 `ResetInfo` 类,仅电梯线程交互,从而帮助电梯类完成特定功能。 #### UML 类图协作图的作用 通过本次作业中的 UML 类图和协作图可以看出,整个设计结构非常清晰。其中,`transfor` 类用于计算转移矩阵,并被 `InputModel` 和 `Elevator` 调用[^2]。这种模块化的设计有助于提升代码可读性和维护性。 #### 数据类型的优化重构经验 在第二单元的学习过程中,发现第一单元中使用的某些数据类型不够合理(例如,在多项式计算场景中使用字符串表示幂的底数)。这导致约一半的第一单元代码需要重新设计和调整[^3]。然而,这一过程也带来了积极的影响——学生能够更深入地理解面向对象的思想,学会优先构建整体框架再填充具体实现细节。 #### 性能分析工具的应用 在开发环境中,利用 IDEA 提供的性能分析器可以监控 CPU 的运行时间分布情况。当程序执行完毕或者因异常终止时,会展示占用较多资源的方法调用链路[^4]。这种方法可以帮助开发者快速定位瓶颈并优化算法效率。 ```java // 示例:如何定义一个简单的 Occupied 类来管理电梯状态 public class Occupied { private boolean isBusy; public synchronized void occupy() throws InterruptedException { while (isBusy) { wait(); } isBusy = true; } public synchronized void release() { isBusy = false; notifyAll(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值