简化的配方二进制格式与010Editor模板

之前的那个fmd格式留的余量比较大,比如成分名称留了16个字符,每个成分带了8字节的备注数组,适合长远点的数据保存。但最常用的配方信息保存,似乎不用那么繁杂。于是简化了一下设计,做成以下的样子:
为了区别起见,原来的格式后缀为fmd,简化后的为fmds,增加的s表示简化了的simplified意思。同时内部的前三个字节从fmd变成了fms以示区别。

FMDS格式示例与解析结果

这一版的将配方名称/别名/成分名称都改为8个字符,成分的MEMO取消了。保留电导率和密度值,但不再保存缺失的系数信息(确有需要的可以写入背景信息中)。同时原来保留背景信息和缺失系数信息的两个指针的空间放了文件头的尺寸与背景信息的尺寸。
配方成分个数从最多保存20个,修改成16个。最多保存的背景信息条数,也是16条。
增加了一处64位标识,放在第9~16字节。现在看到有一个0F字节,只演示了它的最低4位占用的情况。这样整个结构变成了0x240字节,也就是576字节,不到1K,相当小巧了。

同时解析它的010 EDITOR模板也有所修改以适用这一情况。

fmds模板

点击查看模板的代码,BT格式
RequiresVersion(16); //update on 2025-8-2 此模板需要最低版本为16的010Editor
typedef struct {char c <fgcolor=(this==0?0xeeeeee:cBlack)>;} clrChar <optimize=false>; 
     //定义一个结构
     typedef struct {
        clrChar cmpName[8];
        double Wt <fgcolor=(this > 0 ? cGray : 0xeeeeee ),comment="Formula Wt">;  
       }  FITEM <optimize=false>;
    
    typedef  struct {
    double estMD <fgcolor=cPurple>;  //定义变量estMD, 二区显示为紫色。
    double estDDL <fgcolor=cGreen>;  //定义变量estDDL, 二区显示为绿色。
    } Estimation <optimize=false,read=GetEstValues>; //不优化
    
     string GetEstValues(Estimation& est){
          local string estResult=""; //定义一个局部变量
          if(est.estMD>0)
            estResult +="D:" + Str("%.3f g/ml;",est.estMD);  //如果变量值不为空,则返回D:x.yyy g/ml;这样的结果,显示在果区的value列。
          if (est.estDDL>0)
            estResult +="C:" + Str("%.2f mS/cm;",est.estDDL); //类似的,如果不为空则字符串加上C:x.yy mS/cm;
          return estResult;  //返回这个局部变量的值作为结果。
           } 
       
      typedef struct  {char FormuBGinfo[16] <fgcolor=setBGInfo_fgcolor>;} BGITEM <optimize=false,read=GetBGITEMcontent>;   //结构只包括一个64字节的字符数组,对应一项背景信息; 在二区显示时字体为灰色。
        string GetBGITEMcontent(BGITEM& bgi){  //读取BGITEM内容的函数很简单,如果该64字节的字符数组第一个字符不为空字符,则将返回该字符数组(自动转化为字符串,解析器处理),否则返回一个空串。
          if(bgi.FormuBGinfo[0]!='\0')
          return bgi.FormuBGinfo;
          else
          return "";
           }
     int64  setBGInfo_fgcolor(char c[16]){
        if (c[0]!=0)
        return cGray;
        else
        return 0xeeeeee;        
        }        
    struct ParsedData { //整个fmd文件对应的结构名为ParsedData,变量名为Parsed_Data.
    char FileSign[4] <comment="== FMD"> ; //第一个变量为四字节的字符数组,固定为FMD(以防止文件名的后缀变化时不能正确识别)。comment为在果区 comment列显示 ==  FMD 
    char FileStyleVer[4] <comment="Formula Format ID \d{3}">; //第二个变量为四字节的文件格式,与fmd文件的二进制格式有关。此模板对应的这个值是0x001。
   struct {char cBit <fgcolor=(this==0 ? cSilver : cRed)>;}statusBit[8]<optimize=false>;
    
 //   struct {char cBit <fgcolor=setbitColor>;}statusBit[8]<optimize=false>;
 //   int64 setbitColor (char c){if(c==0) return cBlue; else return cRed;} // 实在想不出来为何语法错误?
    char FormuName[8] <fgcolor=cBlack>; //第10个变量,保存配方的名称,最长32字节,二区显示为蓝色。
    //根据上面定义的bSaveEstValue变量解析,如果不为0,则定义Estimation
    char FormuAlias[8] <fgcolor=(this[0]=='?'?0xeeeeee:cBlue)>;
     Estimation estValues;
   FITEM fi[16]; //再定义一个FITEM类型的数组(20个元素,用于存放最多20个成分)       
   int szHeader <fgcolor=0xffaaaa>; 
   int szBgInfo <fgcolor=0xffccaa>; 
   char reserved[8]<fgcolor=cSilver>;
   BGITEM bgi[16];
   
} Parsed_Data;

如果配方名称需要保密,可以在保存文件的代码中进行操作,以下就是加密过的配方名称(不过含量没有加密),作为示例。

加密后的配方

为了更方便的展示效果,录了一小段视频如下:

Video_BT模板与FMDS文件解析

posted @ 2025-08-10 14:39  dingxianghuan  阅读(38)  评论(0)    收藏  举报