簡(jiǎn)化的配方二進(jìn)制格式與010Editor模板
之前的那個(gè)fmd格式留的余量比較大,比如成分名稱留了16個(gè)字符,每個(gè)成分帶了8字節(jié)的備注數(shù)組,適合長(zhǎng)遠(yuǎn)點(diǎn)的數(shù)據(jù)保存。但最常用的配方信息保存,似乎不用那么繁雜。于是簡(jiǎn)化了一下設(shè)計(jì),做成以下的樣子:
為了區(qū)別起見(jiàn),原來(lái)的格式后綴為fmd,簡(jiǎn)化后的為fmds,增加的s表示簡(jiǎn)化了的simplified意思。同時(shí)內(nèi)部的前三個(gè)字節(jié)從fmd變成了fms以示區(qū)別。

這一版的將配方名稱/別名/成分名稱都改為8個(gè)字符,成分的MEMO取消了。保留電導(dǎo)率和密度值,但不再保存缺失的系數(shù)信息(確有需要的可以寫(xiě)入背景信息中)。同時(shí)原來(lái)保留背景信息和缺失系數(shù)信息的兩個(gè)指針的空間放了文件頭的尺寸與背景信息的尺寸。
配方成分個(gè)數(shù)從最多保存20個(gè),修改成16個(gè)。最多保存的背景信息條數(shù),也是16條。
增加了一處64位標(biāo)識(shí),放在第9~16字節(jié)。現(xiàn)在看到有一個(gè)0F字節(jié),只演示了它的最低4位占用的情況。這樣整個(gè)結(jié)構(gòu)變成了0x240字節(jié),也就是576字節(jié),不到1K,相當(dāng)小巧了。
同時(shí)解析它的010 EDITOR模板也有所修改以適用這一情況。

點(diǎn)擊查看模板的代碼,BT格式
RequiresVersion(16); //update on 2025-8-2 此模板需要最低版本為16的010Editor
typedef struct {char c <fgcolor=(this==0?0xeeeeee:cBlack)>;} clrChar <optimize=false>;
//定義一個(gè)結(jié)構(gòu)
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, 二區(qū)顯示為紫色。
double estDDL <fgcolor=cGreen>; //定義變量estDDL, 二區(qū)顯示為綠色。
} Estimation <optimize=false,read=GetEstValues>; //不優(yōu)化
string GetEstValues(Estimation& est){
local string estResult=""; //定義一個(gè)局部變量
if(est.estMD>0)
estResult +="D:" + Str("%.3f g/ml;",est.estMD); //如果變量值不為空,則返回D:x.yyy g/ml;這樣的結(jié)果,顯示在果區(qū)的value列。
if (est.estDDL>0)
estResult +="C:" + Str("%.2f mS/cm;",est.estDDL); //類似的,如果不為空則字符串加上C:x.yy mS/cm;
return estResult; //返回這個(gè)局部變量的值作為結(jié)果。
}
typedef struct {char FormuBGinfo[16] <fgcolor=setBGInfo_fgcolor>;} BGITEM <optimize=false,read=GetBGITEMcontent>; //結(jié)構(gòu)只包括一個(gè)64字節(jié)的字符數(shù)組,對(duì)應(yīng)一項(xiàng)背景信息; 在二區(qū)顯示時(shí)字體為灰色。
string GetBGITEMcontent(BGITEM& bgi){ //讀取BGITEM內(nèi)容的函數(shù)很簡(jiǎn)單,如果該64字節(jié)的字符數(shù)組第一個(gè)字符不為空字符,則將返回該字符數(shù)組(自動(dòng)轉(zhuǎn)化為字符串,解析器處理),否則返回一個(gè)空串。
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 { //整個(gè)fmd文件對(duì)應(yīng)的結(jié)構(gòu)名為ParsedData,變量名為Parsed_Data.
char FileSign[4] <comment="== FMD"> ; //第一個(gè)變量為四字節(jié)的字符數(shù)組,固定為FMD(以防止文件名的后綴變化時(shí)不能正確識(shí)別)。comment為在果區(qū) comment列顯示 == FMD
char FileStyleVer[4] <comment="Formula Format ID \d{3}">; //第二個(gè)變量為四字節(jié)的文件格式,與fmd文件的二進(jìn)制格式有關(guān)。此模板對(duì)應(yīng)的這個(gè)值是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;} // 實(shí)在想不出來(lái)為何語(yǔ)法錯(cuò)誤?
char FormuName[8] <fgcolor=cBlack>; //第10個(gè)變量,保存配方的名稱,最長(zhǎng)32字節(jié),二區(qū)顯示為藍(lán)色。
//根據(jù)上面定義的bSaveEstValue變量解析,如果不為0,則定義Estimation
char FormuAlias[8] <fgcolor=(this[0]=='?'?0xeeeeee:cBlue)>;
Estimation estValues;
FITEM fi[16]; //再定義一個(gè)FITEM類型的數(shù)組(20個(gè)元素,用于存放最多20個(gè)成分)
int szHeader <fgcolor=0xffaaaa>;
int szBgInfo <fgcolor=0xffccaa>;
char reserved[8]<fgcolor=cSilver>;
BGITEM bgi[16];
} Parsed_Data;
如果配方名稱需要保密,可以在保存文件的代碼中進(jìn)行操作,以下就是加密過(guò)的配方名稱(不過(guò)含量沒(méi)有加密),作為示例。

為了更方便的展示效果,錄了一小段視頻如下:

浙公網(wǎng)安備 33010602011771號(hào)