本发明属于工控系统领域,涉及一种数据存储技术,具体而言涉及一种数据文件的修复方法。
背景技术:
工控系统稳定性、可靠性及其重要,其运行依赖一系列数据文件,这些数据文件是一个连续存放的字节流,存放在存储器中。但由于种种原因,某些字节有可能发生变化,导致文件错乱、系统瘫痪,后果不堪设想。现有技术中,解决此问题的通常方法是整个文件备份,但是此方法增大了1倍的存储开销,成本偏高。
技术实现要素:
为了解决现有技术存在的问题,本发明旨在提供一种数据文件修复的方法,该方法以很小的存储开销弥补某些数据错乱带来的危害。
为实现上述技术目的,达到上述技术效果,本发明通过以下技术方案实现:
一种数据文件修复的方法,其包括以下步骤:
步骤1)将数据元素排成m行*n列的矩阵,要求m与n大体相等,若原始数据长度不足,可适当补齐,所述数据元素包括字节、字和双字等;
步骤2)选择一种可逆运算f,其逆运算f,满足:
z=f(x,y)……………………………………(1)
x=f(z,y),y=f(z,x)………………………………(2)
上式(1)、(2)中,x,y,z都属于所述数据元素的数据类型,
举例:如果数据元素为8位字节,则可选择无进位字节加法作为运算f,其逆运算f就是无进位字节减法;
步骤3)初始化
对1~m行逐行进行连续f运算,保存到1~m数组,对1~n列进行连续f运算,保存到1~n数组,若数据元素为字节,f运算为无进位字节加法,则连续f运算称之为累加和;
步骤4)检查
在系统运行过程中,上述m行n列矩阵数据、行累加和数组以及列累加和数组都有可能发生错误,需要进行巡回检查;
对每行巡回进行累加和,是否等于初始化时的行累加和,得出错误的行数a,以及错误行号集合x,如果为0,说明矩阵数据与行累加和数组能相互验证,没有错误;
对每列巡回进行累加和,是否等于初始化时的列累加和,得出错误的列数b,以及错误行号集合y,如果为0,说明矩阵数据与列累加和数组能相互验证,没有错误;
步骤5)判断并修复
①如果a=0,b>0,说明初始化的列累加和数组出现错误,重新计算错误的列累加和,并保存;
②如果a>0,b=0,说明初始化的行累加和数组出现错误,重新计算错误的行累加和,并保存;
③如果a=1,b=1,说明只有一个字节出现错误,根据集合x,y可直接得出错误元素所在的位置坐标,利用列或行累加和进行逆运算,可以算出正确的数据;
④如果a=1,b>1,则错误字节出现在一行多列,根据集合x,y可得出错误元素所在的位置坐标,利用列累加和进行逆运算,可以逐一算出正确的数据;
⑤如果a>1,b=1,则错误字节出现在一列多行,根据集合x,y可得出错误元素所在的位置坐标,利用行累加和进行逆运算,可以逐一算出正确的数据;
⑥如果a=2,且b>=2,且y集合的列号连续(从n与1之间也属于连续,n在前,1在后),可假定每列只有一个错误元素,可以利用列累加和数组逐一还原数据,最后重新校验行累加和,如果符合,还原成功,否则还原失败;
⑦如果a>=2,且b=2,且x集合中的行号连续(从m与1之间也属于连续,m在前,1在后),可假定每行只有一个错误元素,可以利用行累加和数组逐一还原数据,最后重新校验列累加和,如果符合,还原成功,否则还原失败;
⑧如果a>2且b>2无法还原。
本发明的有益效果如下:
与现有技术相比,本发明的方法的价值在不增加存储器开销的前提下,极大提升了数据的安全性,在工控领域极大提高控制器、网关等关键设备的可靠性。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,并可依照说明书的内容予以实施,以下以本发明的较佳实施例并配合附图详细说明如后。本发明的具体实施方式由以下实施例及其附图详细给出。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中;
图1表示本发明的方法将数据元素排成m行*n列的初始化矩阵示意图。
图2表示本发明的方法当a=0,b>0时的矩阵示意图。
图3表示本发明的方法a=1,b=1时的矩阵示意图。
图4表示本发明的方法a=1,b>1时的矩阵示意图。
图5表示本发明的方法a>2且b>2时的矩阵示意图。
具体实施方式
下面将参考附图并结合实施例,来详细说明本发明。
一种数据文件修复的方法,其包括以下步骤:
步骤1)将数据元素排成m行*n列的矩阵,要求m与n大体相等,若原始数据长度不足,可适当补齐,所述数据元素包括字节、字和双字等;
步骤2)选择一种可逆运算f,其逆运算f,满足:
z=f(x,y)……………………………………(1)
x=f(z,y),y=f(z,x)………………………………(2)
上式(1)、(2)中,x,y,z都属于所述数据元素的数据类型,
举例:如果数据元素为8位字节,则可选择无进位字节加法作为运算f,其逆运算f就是无进位字节减法;
步骤3)初始化
如图1所示,对1~m行逐行进行连续f运算,保存到1~m数组,对1~n列进行连续f运算,保存到1~n数组,若数据元素为字节,f运算为无进位字节加法,则连续f运算称之为累加和;
步骤4)检查
在系统运行过程中,上述m行n列矩阵数据、行累加和数组以及列累加和数组都有可能发生错误,需要进行巡回检查;
对每行巡回进行累加和,是否等于初始化时的行累加和,得出错误的行数a,以及错误行号集合x,如果为0,说明矩阵数据与行累加和数组能相互验证,没有错误;
对每列巡回进行累加和,是否等于初始化时的列累加和,得出错误的列数b,以及错误行号集合y,如果为0,说明矩阵数据与列累加和数组能相互验证,没有错误;
步骤5)判断并修复
①如果a=0,b>0,说明初始化的列累加和数组出现错误,重新计算错误的列累加和,并保存,如图2所示;
②如果a>0,b=0,说明初始化的行累加和数组出现错误,重新计算错误的行累加和,并保存;
③如果a=1,b=1,说明只有一个字节出现错误,根据集合x,y可直接得出错误元素所在的位置坐标,利用列或行累加和进行逆运算,可以算出正确的数据,如图3所示;
④如果a=1,b>1,则错误字节出现在一行多列,根据集合x,y可得出错误元素所在的位置坐标,利用列累加和进行逆运算,可以逐一算出正确的数据,如图4所示;
⑤如果a>1,b=1,则错误字节出现在一列多行,根据集合x,y可得出错误元素所在的位置坐标,利用行累加和进行逆运算,可以逐一算出正确的数据;
⑥如果a=2,且b>=2,且y集合的列号连续(从n与1之间也属于连续,n在前,1在后),可假定每列只有一个错误元素,可以利用列累加和数组逐一还原数据,最后重新校验行累加和,如果符合,还原成功,否则还原失败;
⑦如果a>=2,且b=2,且x集合中的行号连续(从m与1之间也属于连续,m在前,1在后),可假定每行只有一个错误元素,可以利用行累加和数组逐一还原数据,最后重新校验列累加和,如果符合,还原成功,否则还原失败;
⑧如果a>2且b>2无法还原,如图5所示。
例如:
现有16进制数据文件{0x35,0x79,0x9d,0x48,0x15,0xf3,0x4d,0x30,0x81},f运算采用无进位16进制加法。
首先,排列成3*3的阵列,并计算出行累加和数组{4b,50,fe}和列累加和数组{ca,be,11};
然后,检查过程:巡回检查上述阵列数据的行累加和与列累加和,与前面保存的数组相比较,可能有如下各种情况:
a:完全符合,说明原始数据阵列,行累加和数组,列累加和数组都没有错误。
b:行累加和数组符合,列累加和数组存在不符合,说明列累加和数组出现错误,需要重新计算并保存。依次类推,列累加和数组符合,行累加和数组存在不符合,说明行累加和数组出现错误,需要重新计算并保存。
c:如果出现有1行1列不符合,比如,2行2列为0x33时,必然导致行数组和列数组各有一个不符合,由此得出错误数据的坐标(2,2),并且其数值=0x50-0x48-0xf3=0x15。
d:如果出现有1行多列不符合,比如下表。可以推断坐标为(1,2)和(3,2)数据错误,因为1列与3列只是各有1个错误,因此用列累加和还原
(1,2)=0xca-0x35-0x4d=0x48
(3,2)=0x11-0x9d-0xfe=0xf3
依次类推,1列多行不符合的情况,可用行累加和进行还原。
e:如果出现2行多列不符合,比如下表有2行2列不符合,可以先假定:1)错误的数据是连续存放的相关的,2)每列只错了1行,因此用列累加和还原
(2,3)=0x11-0x9d-0x81=0xf3
(3,1)=0xca-0x35-0x48=0x4d
再用行累加和进行校验,如果正确则说明还原成功。
依次类推,2列多行不符合的情况,也可以用类似的原则假定,还原之后用列累加和作最后的校验。
f:如果出现多于2行多于2列的不符合,无法还原。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。