逆向破解压汞仪 SMP 原始文件:复现 MicroActive 计算,重构开发了一个轻量分析工具

18次阅读
没有评论

共计 3469 个字符,预计需要花费 9 分钟才能阅读完成。

逆向破解压汞仪 SMP 原始文件:复现 MicroActive 计算,重构开发了一个轻量分析工具

你可能在知乎上,公众号里看到过很多测试机构分享如何解析压汞(MIP) 测试(或者BET测试)中的PDF或者XLS文件中的内容。也可能有少部分的人知道用Micromeritics官网提供的MicroActive AutoPore V9600软件来打开SMP文件查看原始记录信息。
需要知道的是,SMP是记录了测试中的所有原始信息,但pdf和XLS是在MicroActive的参数设定后输出的文件。即便是MicroActive读取了SMP文件,也会因为软件内部算法掩盖SMP文件中的真实数据!
今天我们将彻底破解压汞SMP文件的全部内容,理清全部的数据结构,并复现MicroActive中的算法,重新开发一套压汞分析软件!
初衷
1、完全破解数据结构 ,破解算法,一探究竟!
2、MicroActive AutoPore V9600软件不完美支持多数据重叠查看!界面太老旧!
ok,开发完成了 (感谢Codex没日没夜的干活)
逆向破解压汞仪 SMP 原始文件:复现 MicroActive 计算,重构开发了一个轻量分析工具
开源地址:https://github.com/dragonMaLong/mercury-smp-analyzer
软件下载地址:https://github.com/dragonMaLong/mercury-smp-analyzer/releases/download/v0.1.2/Mercury-SMP-Analyzer-zh-CN.exe

一、SMP 文件,这个带目录的二进制文档究竟是讲了什么

SMP 文件不是文本,而是一种二进制档案,直接用记事本打开只能看到乱码。它的组织方式可以比喻成一个「带目录的文件夹」:文件开头是固定的文件头(含格式签名 MIC##&&FS、版本号、创建与修改时间等),紧接着是一张目录表,表里每一条记录都指明了某个数据块在文件中的起始位置和大小。这些数据块在 Micromeritics 内部被称为 SUBSET,按编号归类——样品描述、方法参数、穿透计参数、核心测量数据、材料属性、事件日志等各占一块,比如样品质量和抽真空参数放在 SUBSET626,接触角、表面张力和压力程序表放在 SUBSET627,最关键的逐点测量数据(压力、电容变化量等)则存在 SUBSET630。要读懂一个 SMP 文件,思路就是先读文件头、再查目录表定位到目标块、最后按该块的字段格式逐字节解析。特别要提一个机制:当你在 MicroActive 里修改了样品描述之类的信息,软件不会覆盖原来的数据块,而是在文件末尾追加一个新块,再更新目录表的指向。这导致同一字段在不同文件里的物理位置并不固定,解析时只能依赖目录表动态定位,不能把偏移量写死。

二、SMP 原始数据 ≠ 软件给你看的数据

1、SMP 里只存的是原始电容(pF)。你在报告里看到的体积(mL/g)是MicroActive算出来的。

2、高压段的压力被悄悄修正过。 SMP 存的是传感器原始读数,MicroActive 出报告时默认对高压段加了「汞柱头压修正」(约 3.2~3.9 psia)。这意味着如果你拿原始压力直接算孔径,结果会和官方报表对不上。

3、报告里的汞密度,大多是推算的不是实测的。SMP 里只有高压初期约 39 个点有实测汞密度,其余靠软件内置的温度-密度表推算。
4、软件还默默做了几道”清洗”。比如过滤端口切换时的噪点、退汞段强制单调不增、负增量显示为 0。这些都是报告里看不到、但确实发生了的处理。
5、发现了一个 bug。 存「真密度」的位置实际存的是「真密度+样品质量」。是厂商 bug,但是并不影响计算。

三、MicroActive处理SMP文件是如何处理数据的?

1、MicroActive的平滑算法:你从 MicroActive 导出、平时直接拿去画图、写报告、发论文的那条孔径分布曲线,不是原始计算结果——它是被一套特定算法平滑过的。Log Differential 和 Differential 两列之间的换算系数不是 ln(10)!,不是平滑微分列,实际用的是由网格步长 h 决定的因子 (10^h − 1)/h,即先把累积进汞量 V 放到 log₁₀(D) 坐标下 → 用 Akima 插值重采样到 250 个等间距的 log 网格点 → 在网格上用 9 点二阶 Savitzky-Golay 求一阶导数(得到平滑的 dV/dlogD)→ 再插值回原始孔径点。

2、各列的定义与来源(标绿的是excel中不会被MicroActive输出的

列名
含义
来源 / 怎么算出来的
Pressure (psia)
施加压力
SMP 原始记录(已加汞柱头压修正)
Pore Diameter (nm)
孔径 D
由压力经 Washburn 方程换算:D = −4γcosθ / P
Cumulative Pore Volume (mL/g)
累积进汞量 V
由电容变化量 × 穿透计常数 ÷ 样品质量得到,是所有微分列的源头
Incremental Pore Volume (mL/g)
增量进汞量 ΔV
相邻两点累积体积之差:Vᵢ − Vᵢ₋₁
Differential Intrusion Raw (mL/g/nm)
原始线性微分 dV/dD
由相邻点直接差分:ΔV / ΔD
Differential Intrusion (mL/g/nm) 
平滑线性微分 dV/dD
由平滑后的 Log 微分换算回来(见表二)
Log Differential Intrusion Raw (mL/g)
原始对数微分 dV/dlogD
由相邻点直接差分:ΔV / Δlog₁₀D
Log Differential Intrusion (mL/g)
平滑对数微分 dV/dlogD
平滑算法的核心输出,即报告主曲线的纵轴
% of Total Intrusion Volume
累积进汞占总量百分比
Vᵢ / V_total × 100
% Incremental Intrusion Volume
该点增量占总量百分比
ΔVᵢ / V_total × 100
关系
原始路径(Raw,直接差分)
平滑路径(MicroActive 默认输出)
起点
累积体积 V 与孔径 D
同一条累积体积 V
求 dV/dlogD
ΔV / Δlog₁₀D(逐点差分,毛刺大)
V 在 log₁₀D 坐标下 Akima 插值到 250 个等间距网格 → 9 点二阶 Savitzky-Golay 求导 → 插回原孔径点
得到列
Log Differential Intrusion Raw
Log Differential Intrusion
dV/dlogD → dV/dD
dV/dD = (dV/dlogD) / (D × ln10) ≈ /(D×2.3026)
dV/dD = (dV/dlogD) / (D × (10ʰ−1)/h) ,本网格下该因子 ≈ 2.35482
得到列
Differential Intrusion Raw
Differential Intrusion

四、软件开发

把文件格式、计算口径、连同这套平滑算法全部摸清并复现之后,我把它们包成了一个轻量的桌面工具——既然能自己读、自己算、还能复现官方曲线,那不如做成一个真正能日常用的东西。

相比较于官网的特点

1、多样品对比——一次开多个 SMP、随时追加不清空、蓝点一点控制某个样品是否参与绘图、可按测试时间排序。可以把几个样的孔径分布叠在一张图上看,不用再一个个导出拼 Excel。
2、改参数立刻重算,且不动原始文件——接触角、表面张力直接在表里改,孔径和分布立刻按 Washburn 重算;改动只在内存里,原始 SMP 不变。

需要说明一下目前的适用范围。这个工具是针对 Micromeritics(麦克)AutoPore 系列压汞仪、由 MicroActive 软件生成的 .SMP 文件开发的,开发和验证过程中使用的是 AutoPore V 9600 配 MicroActive 2.03.00(文件格式版本 MIC##&&FS 0200),并已用几十个带实际测量数据的真实 SMP 文件做过交叉验证。如果你用的是同系列仪器和相近版本的 MicroActive,基本可以直接打开使用;其他型号或差异较大的格式版本,由于 SMP 内部块结构可能不同,能否正确解析需要实测才知道——这种情况欢迎反馈样例文件,我可以据此适配。

功能上,它目前覆盖的是日常分析中最高频的那条流程:打开单个或多个 SMP 文件、按复现的 MicroActive 算法计算孔径与孔径分布(含那套平滑逻辑)、多样品叠加对比、在线修改接触角和表面张力并即时重算、框选压力区间做局部分析、以及把选中样品一键导出为 Excel。

暂时还不能做的事也讲清楚:它不是 MicroActive 完整报表系统的替代品,不包含数据库管理、批量自动出报、以及全部报告项的复刻;一些尚未完全确认的字段(如个别版本下的某些方法参数)也不保证 100% 准确。简单说,它解决的是「为了对比几个样反复导出」这类琐碎痛点,而不是替你出正式报告。

正文完
欢迎打赏
post-qrcode
 
龙龙龙
版权声明:本站原创文章,由 龙龙龙 2026-06-01发表,共计3469字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)