本发明属于数据恢复领域,具体涉及一种分类提取access数据库中碎片数据的方法。
背景技术:
随着信息时代的来临,对数据的管理和应用都离不开数据库。数据库系统是计算机应用系统的重要组成部分之一。数据库技术已广泛应用于数据处理、信息检索、人工智能等诸多方面,数据库应用技术是从事计算机工作的人员必备的技术之一。
access数据库管理系统是microsoftoffice套件的重要组成部分。access适用于小型商务活动,用以存储和管理商务活动所需要的数据access不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利用各种数据源生成窗体、表单、查询、报表、应用程序等。
access的用途体现在两个:
一、进行数据分析:access有强大的数据处理、统计分析能力,利用access的查询功能,可以方便地进行各类汇总、平均等统计。并可灵活设置统计的条件。比如在统计分析上万条记录、十几万条记录及以上的数据时速度快且操作方便。
二、开发软件:access用来开发软件,比如生产管理、销售管理、库存管理等各类企业管理软件,其最大的优点是:易学!非计算机专业的人员,也能学会。低成本地满足了那些从事企业管理工作的人员的管理需要,通过软件来规范同事、下属的行为,推行其管理思想。
access数据库中,数据的最小访问单位是字段,由多个定长字段/多个变长字段组成一张表,且相同存储格式的表存放同一类的数据。
在access数据库的使用过程中,难免会遇到误操作、人为恶意破坏、软硬件故障等原因对数据库造成损坏,丢失重要数据。此时,从碎片数据中对access数据库进行恢复并找回数据,就显得至关重要,但现有技术中,尚无一种能够分类提取access数据库中碎片数据的方法。
技术实现要素:
本发明针对现有技术的不足问题,提出了一种分类提取access数据库中碎片数据的方法,根据同一表的数据其存储格式相同的原理,将access数据库的碎片数据中列数、变长字段个数及位图长度均相同的数据项集合提取为access数据库中同一表的数据,换言之,不同的列数、变长字段个数及位图长度为不同表的数据,从而达到分类提取数据及恢复数据的目的,包括以下步骤:
s001:获取数据源,所述数据源包含access数据库和/或access数据库的碎片数据;
s002:将所述数据源均分为多个数据页并寻址第一数据页,其中,每一所述数据页的长度为n扇区,n为大于1的自然数;
s003:寻址下一数据页并对地址addr赋初值0;
s004:判断是否成功获取数据页,如果是,执行步骤s005,否则执行步骤s010;
s005:判断当前数据页是否符合access数据库的数据页标准,如果是,执行步骤s006,否则,执行步骤s003;
s006:从当前数据页中读取连续2字节的值,所述2字节的值以小端格式存储;
s007:判断是否能够读取连续2字节的值,如果是,执行步骤s008,否则,执行步骤s003;
s008:判断所述2字节的值是否符合access数据库的数据项的列数规则,如果是,执行步骤s009,否则,执行步骤s006,其中,所述数据项包括列数、数据体、数据体长度、n个偏移地址、变长字段个数n及位图长度,n为不小于0的整数;
s009:判断所述2字节的值是否符合access数据库的数据项的定位规则,如果是,执行步骤s010,否则,执行步骤s006;
s010:获取当前数据项集合h,将当前数据项集合h并入数据项数据体集合h中;
s011:根据所述数据项数据体集合h的列数、变长字段个数n、位图长度,分类提取access数据库中的碎片数据:将列数、变长字段个数n及位图长度均相同的数据项集合h提取为access数据库中同一表的数据。
优选地,n等于8。
优选地,所述步骤s004的具体步骤如下:
判断数据页数是否为0,如果是,表示获取数据页失败,执行步骤s005,否则,表示获取数据页成功,执行步骤s010。
优选地,所述步骤s005的具体步骤如下:
s0051:从当前数据页中随机获取10个字节的值;
s0052:判断所述10字节的值是否具有9个以上的值为0x00,如果是,执行步骤s003,否则,执行步骤s0053;
s0053:判断所述10字节的值是否具有6个以上且8个以下的值为0x00,如果是,执行步骤s006,否则,执行步骤s0054;
s0054:判断所述10字节的值是否具有6个以上的非0x00的相同值,如果是,执行步骤s003,否则,执行步骤s006。
优选地,所述步骤s007的具体步骤如下:
如果地址addr大于或等于4095,则表示连续读取2字节的值失败,执行步骤s003,否则,执行步骤s008。
优选地,所述步骤s008的具体步骤如下:
s0081:判断所述2字节中第一字节的值为非0x00,如果是,执行步骤s0082,否则,执行步骤s0083;
s0082:判断所述2字节中第二字节的值为0x00,如果是,执行步骤s009,否则,执行步骤s0083;
s0083:地址addr=地址addr+1,并执行步骤s006。
优选地,所述步骤s009的具体步骤如下:
s0091:定义变量m、b、c,均赋初值为0,定义变量d,初始赋值为地址addr,定义变量e,初始赋值为步骤s006中所述连续2字节的值,其中,变量m、b、c、d、e均为十六进制数;
s0092:判断当前的地址addr是否小于4095,如果是,执行步骤s0093,否则,执行步骤s006;
s0093:寻址当前的地址addr并读取连续2字节的值,将当前连续2字节的值赋给变量b;
s0094:判断变量b是否等于变量m,如果是,执行步骤s0096,否则,执行步骤s0095;
s0095:地址addr=地址addr+1,m=m+1,并执行步骤s0092;
s0096:地址addr=地址addr+2,寻址当前的地址addr并读取连续2字节的值,将当前连续2字节的值赋给变量c;
s0097:判断变量c是否小于变量b,如果是,执行步骤s010,否则,执行步骤s006。
优选地,所述步骤s010的具体步骤如下:
s0101:定义数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3},数据项集合h中各元素均赋初值为0;
将当前变量e的值放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
数据项起始地址用变量d表示,数据项数据体中变长字段相对于数据项起始地址d的偏移地址用当前的地址addr表示,数据项数据体长度为a-4-d;
s0102:定义变量p、q,均赋初值为0;
s0103:判断当前的地址addr是否小于4095,如果是,执行步骤s0104,否则,执行步骤s0108;
s0104:寻址当前的地址addr并读取连续2字节的值,并将当前连续2字节的值赋给变量q;
s0105:判断变量q、p的值是否相等,如果是,执行步骤s0107,否则,执行步骤s0106;
s0106:地址addr=地址addr+2,p=p+1,执行步骤s0103;
s0107:将当前变量q的值作为变长字段个数n的值value1并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
s0108:地址addr=地址addr+2,当前的地址addr作为位图的起始地址,位图的长度=(e+7)/8的商,将(e+7)/8的商作为位图的长度的值value2并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
s0109:根据步骤s0101数据项起始地址d及数据项数据体长度a-4-d,获得数据项的起始地址addr_start为d、结束地址addr_end为d+4+a-d+value1*2+value2,以addr_start为起始地址、以addr_end为结束地址,在数据页中读取数据作为数据项的值value3并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};。
优选地,所述步骤s011的具体步骤如下:
s0111:定义变量l,将数据项数据体集合h的长度赋给l,定义变量j、i并均赋初值为0,定义集合cj用以存放不同表的数据;
s0112:判断数据项数据体集合h的长度l是否大于0,如果是,执行步骤s0113,否则,结束流程;
s0113:顺序获取数据项数据体集合h中的一个数据项集合h,l=l-1,j=i;
s0114:判断j是否大于0,如果是,执行步骤s0115,否则执行步骤s0119;
s0115:判断集合cj中的列数与数据项集合h中的列数的值是否相等,如果是,执行步骤s0116,否则,j=j-1,执行步骤s0114;
s0116:判断集合cj中的变长字段个数n与数据项集合h中的变长字段个数n的值是否相等,如果是,执行步骤s0117,否则,j=j-1,执行步骤s0114;
s0117:判断集合cj中的位图长度与数据项集合h中的位图长度的值是否相等,如果是,执行步骤s0118,否则,j=j-1,执行步骤s0114;
s0118:将数据项集合h并入集合cj中,执行步骤s0112;
s0119:i=i+1,生成一个新的集合ci,将数据项集合h并入新的集合ci中。
本发明的有益效果是:解决了现有技术中尚无一种能够分类提取access数据库中碎片数据的方法的技术问题。
附图说明
图1为本发明所提供的方法的总流程图;
图2为本发明实施例中access数据库的数据项的数据格式示意图;
图3为本发明实施例中判断是否符合access数据库的数据项的定位规则的具体流程图;
图4为本发明实施例中获取数据项的具体流程图;
图5为本发明实施例中提取同一表的数据的具体流程图。
具体实施方式
下面结合附图和实施例对本发明作进一步阐述。
图1示出了本发明所提供的方法的总流程图,如图1所示,包括以下步骤:
s001:获取数据源,数据源包含access数据库和/或access数据库的碎片数据,即,数据源可以是access的完整数据库和/或被删除、被损坏的access数据库的碎片数据;
s002:将数据源均分为多个数据页并寻址第一数据页,其中,每一数据页的长度为8扇区;
s003:寻址下一数据页并对地址addr赋初值0;
s004:判断是否成功获取数据页,如果是,执行步骤s005,否则执行步骤s010;具体地,判断数据页数是否为0,如果是,表示获取数据页失败,执行步骤s005,否则,表示获取数据页成功,执行步骤s010;
s005:判断当前数据页是否符合access数据库的数据页标准,如果是,执行步骤s006,否则,执行步骤s003;步骤s005的具体步骤如下:
s0051:从当前数据页中随机获取10个字节的值;
s0052:判断该10字节的值是否具有9个以上的值为0x00,如果是,执行步骤s003,否则,执行步骤s0053;
s0053:判断该10字节的值是否具有6个以上且8个以下的值为0x00,如果是,执行步骤s006,否则,执行步骤s0054;
s0054:判断该10字节的值是否具有6个以上的非0x00的相同值,如果是,执行步骤s003,否则,执行步骤s006;
s006:从当前数据页中读取连续2字节的值,该2字节的值以小端格式存储;
s007:判断是否能够读取连续2字节的值,如果是,执行步骤s008,否则,执行步骤s003;具体地,如果地址addr大于或等于4095,则表示连续读取2字节的值失败,执行步骤s003,否则,执行步骤s008;
s008:判断2字节的值是否符合access数据库的数据项的列数规则,如果是,执行步骤s009,否则,执行步骤s006;
图2示出了本发明实施例中access数据库的数据项的数据格式,如图2所示,数据项包括列数、数据体、数据体长度、n个偏移地址、变长字段个数n及位图长度,n为不小于0的整数;
步骤s008的具体步骤如下:
s0081:判断2字节中第一字节的值为非0x00,如果是,执行步骤s0082,否则,执行步骤s0083;
s0082:判断2字节中第二字节的值为0x00,如果是,执行步骤s009,否则,执行步骤s0083;
s0083:地址addr=地址addr+1,并执行步骤s006;
s009:判断2字节的值是否符合access数据库的数据项的定位规则,如果是,执行步骤s010,否则,执行步骤s006;
图3示出了本发明实施例中判断是否符合access数据库的数据项的定位规则的具体流程图,如图3所示,步骤s009的具体步骤如下:
s0091:定义变量m、b、c,均赋初值为0,定义变量d,初始赋值为地址addr,定义变量e,初始赋值为步骤s006中所述连续2字节的值,其中,变量m、b、c、d、e均为十六进制数;
s0092:判断当前的地址addr是否小于4095,如果是,执行步骤s0093,否则,执行步骤s006;
s0093:寻址当前的地址addr并读取连续2字节的值,将当前连续2字节的值赋给变量b;
s0094:判断变量b是否等于变量m,如果是,执行步骤s0096,否则,执行步骤s0095;
s0095:地址addr=地址addr+1,m=m+1,并执行步骤s0092;
s0096:地址addr=地址addr+2,寻址当前的地址addr并读取连续2字节的值,将当前连续2字节的值赋给变量c;
s0097:判断变量c是否小于变量b,如果是,执行步骤s010,否则,执行步骤s006;
s010:获取当前数据项集合h,将当前数据项集合h并入数据项数据体集合h中;图4示出了本发明实施例中获取数据项的具体流程图,如图4所示,步骤s010的具体步骤如下:
s0101:定义数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3},数据项集合h中各元素均赋初值为0;
将当前变量e的值放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
数据项起始地址用变量d表示,数据项数据体中变长字段相对于数据项起始地址d的偏移地址用当前的地址addr表示,数据项数据体长度为a-4-d;
s0102:定义变量p、q,均赋初值为0;
s0103:判断当前的地址addr是否小于4095,如果是,执行步骤s0104,否则,执行步骤s0108;
s0104:寻址当前的地址addr并读取连续2字节的值,并将当前连续2字节的值赋给变量q;
s0105:判断变量q、p的值是否相等,如果是,执行步骤s0107,否则,执行步骤s0106;
s0106:地址addr=地址addr+2,p=p+1,执行步骤s0103;
s0107:将当前变量q的值作为变长字段个数n的值value1并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
s0108:地址addr=地址addr+2,当前的地址addr作为位图的起始地址,位图的长度=(e+7)/8的商,将(e+7)/8的商作为位图的长度的值value2并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
s0109:根据步骤s0101数据项起始地址d及数据项数据体长度a-4-d,获得数据项的起始地址addr_start为d、结束地址addr_end为d+4+a-d+value1*2+value2,以addr_start为起始地址、以addr_end为结束地址,在数据页中读取数据作为数据项的值value3并放入数据项集合h{列数:e;变长字段个数n:value1;位图长度:value2;数据项:value3};
s011:根据数据项数据体集合h的列数、变长字段个数n、位图长度,分类提取access数据库中的碎片数据:将列数、变长字段个数n及位图长度均相同的数据项集合h提取为access数据库中同一表的数据,换言之,不同的列数、变长字段个数及位图长度为不同表的数据,从而达到分类提取数据及恢复数据的目的;
图5示出了本发明实施例中提取同一表的数据的具体流程图,如图5所示,步骤s011的具体步骤如下:
s0111:定义变量l,将数据项数据体集合h的长度赋给l,定义变量j、i并均赋初值为0,定义集合cj用以存放不同表的数据;
s0112:判断数据项数据体集合h的长度l是否大于0,如果是,执行步骤s0113,否则,结束流程;
s0113:顺序获取数据项数据体集合h中的一个数据项集合h,l=l-1,j=i;
s0114:判断j是否大于0,如果是,执行步骤s0115,否则执行步骤s0119;
s0115:判断集合cj中的列数与数据项集合h中的列数的值是否相等,如果是,执行步骤s0116,否则,j=j-1,执行步骤s0114;
s0116:判断集合cj中的变长字段个数n与数据项集合h中的变长字段个数n的值是否相等,如果是,执行步骤s0117,否则,j=j-1,执行步骤s0114;
s0117:判断集合cj中的位图长度与数据项集合h中的位图长度的值是否相等,如果是,执行步骤s0118,否则,j=j-1,执行步骤s0114;
s0118:将数据项集合h并入集合cj中,执行步骤s0112;
s0119:i=i+1,生成一个新的集合ci,将数据项集合h并入新的集合ci中。
通过本发明提供的方法,解决了现有技术中尚无一种能够分类提取access数据库中碎片数据的方法的技术问题。
应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。