在将配方解析完成之后,它已经是结构化的复合数据,即有归一化的成分名称与百分含量,也有它的一些背景信息。如果我们需要将它存贮起来,有几种选择,一种是以文本形式,比如之前输出的JSON格式,YAML格式或者是CSV格式,这些格式的好处就是人容易看懂,以文本编辑器就可以查看。还有一种方式就是以特定的文件格式来存贮,这里讨论的就是这种方式,就像Word用的doc文件格式,Excel用的xls文件格式,它们不是简单的文本,好处是结构化设计,需要特定的文件解析器来打开,但不那么容易被人看懂。
为此,我设计了一个数据结构来存贮这种信息,C++中的代码如下
可以看到,这个结构中保存了配方的名称(FormuName), 别名(FormuAlias),成分个数(ItemCnt)丶配方测算的电导率和密度丶各成分的名称(cmpName)与含量(cmpWt)丶背景信息(字符数组)丶估算中缺少的一些系数信息(字符数组)。成分的个数(20个)或背景信息的项数(16项)都预留了比较大的余量。
将这些信息以字节流的形式存贮到文件后,可以得到一个二进制格式的文件。查看这个文件,可以看到有些字符串是认识的,但有些信息就不认识了。比如表示双精度的数值就无法直观的看出来。
为了方便的理解文件中各字段的意义,我借用010 Editor中的二进制模板的功能,编写了解析这种文件的模板,模板fmd.bt的内容如下:
大体上可以看出,模板的写法与类的设计有相似之处(模板是类似C语言的语法),这里为了让结构显示更加美观,在模板中增加了一些颜色控制或注释之类的内容,很容易理解。复杂一点的是它的注释函数或读写函数。上例中演示了几个读函数,用于设置模板中数组中单个元素的value:如果第一个字节是不为空,则返回一定的结果,否则就返回空串。
将这个模板用来解析生成的fmd格式文件,就可以得到结果:
010 Editor这个二进制模板的厉害之处,不仅在于可以解析文件,甚至还支持你修改文件。比如说,我可以在模板结果中修改双精度数据的数值,它可以将输入的数值将双精度数据的格式返存回文件,实现了读写双向的功能,十分方便。文本串也是如此。
当然,目前这种基本上还是数据直接存贮到文件中,未经过充分的加密,有点计算机知识的人都能逆向出来原始的数据。为了达到更好的保密效果,则可以对内容进行一定算法的加密,以保证未解密时他人无法阅读配方内容。