一种生成特征码状态表、匹配特征码的方法和装置的制作方法

文档序号:6610010阅读:222来源:国知局
专利名称:一种生成特征码状态表、匹配特征码的方法和装置的制作方法
技术领域
本发明涉及网络安全领域技术,特别是涉及一种生成特征码状态表、匹配特征码的方法和装置。
背景技术
为了保证计算机或网络安全,通常需要检查文件或报文中是否存在妨害安全的信息,比如病毒、攻击程序等。由于这些病毒或攻击程序通常具有某种特征码,所以在检查文件或报文时,特征码就常常被作为被检查的对象。如果检查出文件或报文中存在某种特征码,则可以认为该文件或报文有妨害安全的信息。
特征码一般用正则表达式(Regular Expression)的形式进行描述。比如a{1}(b|c)d为一个正则表达式,表示以字符a开始,后跟一个字符b或c,最后以d结尾。假如在检查时将特征码作为输入的字符串,正则表达式也可以表示输入过程的状态,即先输入字符a,再输入字符b或c,最后输入字符d。也就是说,a{1}(b|c)d这条正则表达式可以表示字符串输入过程的三种状态。
由于正则表达式可以表示字符串输入状态的情况,所以,为了提高检查效率,通常将被检查的正则表达式编译为确定状态机(DFA,DeterministicFinite Automation)的形式。这样,就可以将文件或报文中的字符串作为输入字符串,利用DFA对输入的字符串的状态进行匹配,如果匹配成功,则确定输入字符串中存在特征码,从而实现特征码的匹配。
一般来说,文件或报文中的字符为ASCII码字符,所以DFA通常是一个256列、n行的状态表。其中,256列分别与0~255个ASCII码对应,n行分别与字符串输入过程的各个状态对应,每一个状态值则表示从当前状态达到的下一状态,即状态表保存了所有输入字符和输入状态的对应关系。当需要检查文件或报文时,可以将文件或报文中的字符作为输入的字符串。当输入第一个字符时,从状态表的某一行开始,比如第一行,根据该字符的ASCII码查询对应列的状态值,再转到该状态值表示的行,并判断该行是否为表示成功匹配的行,如果不是,则重新输入下一个字符,并依此类推,直至完成匹配。
下面再用一个具体的例子说明状态表的表示方法。假设正则表达式为a(b|c)+[de]{2,4}f,对应的状态表如表一所示

表一其中,0~95列、96列、103列、104~255列为输入其它ASCII码字符的情况,“结果”列表示是否匹配成功或命中。
假设文件或报文中存在“acddf”这个字符串。当需要检查文件或报文时,从状态表的第0行开始进行匹配,匹配过程为先输入字符a,根据字符a的ACSII码从状态表中确定状态值为1;转到状态表的第1行,判断出没有命中,继续输入字符c;根据字符c的ACSII码从状态表中确定状态值为2;转到第2行,判断出没有命中,继续输入字符d;根据字符d的ASCII码从状态表中确定状态值为3;转到第3行,判断出没有命中,继续输入字符d;根据字符d的ASCII码从状态表确定状态值为4;转到第4行,判断出没有命中,继续输入字符f;根据字符f的ASCII码从状态表中确定状态值为7;转到第7行,判断出命中,即匹配成功。
由此可见,现有技术中的状态表的大小与字符串输入过程的状态数相关。比如某正则表达式表示的字符串输入状态数为1M,那么状态表需要保存的状态值有1M×256=256M。如果每一个状态值用4个字节表示,则状态表总共需要占用256×4=1G字节的存储空间。这样,在查找文件或报文的特征码时,状态表将占用大量的内存。但实际应用中,如果实现特征码匹配的设备内存比较小,可能无法为状态表提供足够的内存,比如用FPGA硬件进行查找,导致无法实现特征码的匹配。

发明内容
有鉴于此,本发明的第一个目的在于提供一种生成特征码状态表的方法,可以大大减少状态表占用的存储空间。
本发明的第二个发明目的在于提供一种匹配特征码的方法,可以利用占用存储空间较少的状态表实现特征码的匹配。
本发明的第三个发明目的在于提供一种生成特征码状态表的装置,生成的状态表可以大大减少占用的存储空间。
本发明第四个发明目的在于提供一种匹配特征码的装置,可以利用占用存储空间较少的状态表实现特征码的匹配。
为了达到上述第一个目的,本发明提出的技术方案为一种生成特征码状态表的方法,该方法为按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;生成的块状态表和块地址表一并作为特征码的状态表。
上述方案中,所述将原状态表分割出的每一类块保存一份在建立的块状态表中并分配对应块地址的方法包括a1、将原状态表第一行作为当前行,将原状态表第一行第一列的块作为当前块;a2、判断块状态表中是否存在与当前块相同的块,如果存在,则将原状态表当前行的下一个块作为当前块;否则,将当前块保存在建立的块状态表中并分配块地址,再将原状态表的下一个块作为当前块;返回执行步骤a2,直至处理完原状态表当前行所有的块;a3、将原状态表的下一行作为当前行,将原状态表当前行第一列的块作为当前块;返回执行步骤a2,直至处理完原状态表所有行。
上述方案中,生成块地址表之后,该方法进一步包括b1、根据块地址表建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;b2、将块地址表和掩码表的第一行作为当前行;b3、统计决地址表当前行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表当前行中;b4、将掩码表当前行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中;b5、将块地址表和掩码表的下一行作为当前行,返回步骤b3,直至处理完块地址表和掩码表的所有行;将块状态表、掩码表和最小块地址列表一并作为特征码的状态表。
上述方案中,所述步骤b4包括b41、将块地址表和掩码表的第一列为当前列;b42、判断块地址表的当前列所保存的块地址是否为缺省块地址,如果是,则将掩码表对应的比特位设置为0;否则,设置为1,并将当前列的块地址保存在最小块地址列表中;b43、将块地址表和掩码表的下一列作为当前列,返回步骤b41,直至处理完块地址表和掩码表的所有列。
针对本发明的第二个目的,本发明提出的技术方案为一种匹配特征码的方法,事先生成特征码的状态表,所述状态表包括块状态表和块地址表;该方法为c1、将输入的第一个字符作为当前字符,将块地址表的第一行作为当前行;c2、根据当前字符的码值从块地址表当前行确定当前字符所属块的块地址;c3、根据块地址从块状态表中获取当前字符所属块,并根据当前字符的码值从当前字符所属块中确定对应的状态值;c4、判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在块地址表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤c2,直至处理完输入的所有字符。
上述方案中,所述字符的码值为ASCII码值,步骤c2所述根据当前字符的码值从块地址表当前行确定当前字符所属块的块地址方法为将当前字符的ASCII码值除以块大小,获得块地址表第一列单元到达保存当前字符所属块地址的单元的距离;再根据块地址表第一列单元到达保存当前字符所属块地址的单元的距离,从块地址表中确定当前字符所属块的块地址。
上述方案中,步骤c3所述根据当前字符的码值从当前字符所属块中确定当前字符对应状态值的方法包括将当前字符的ASCII码值和块大小进行求模运算,获得当前字符所属块第一个状态值达到当前字符对应的状态值的距离;再根据当前字符所属块第一个状态值到达当前字符对应的状态值的距离,从当前字符所属块中确定当前字符对应的状态值。
上述方案中,所述生成特征码状态表的方法包括按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;生成的块状态表和块地址表一并作为特征码的状态表。
针对本发明第二个发明目的,本发明还提出一种技术方案一种匹配特征码的方法,事先生成特征码的状态表,所述状态表包括块状态表、掩码表和最小块地址列表;该方法为d1、将输入的第一个字符作为当前字符,将掩码表的第一行作为当前行;d2、根据当前字符的码值从掩码表当前行确定对应的比特位,判断比特位是否为0,如果是,则根据掩码表当前行对应的索引地址从最小块地址列表中获得块地址;否则,根据当前字符的码值从最小块地址列表中获得块地址;d3、根据获得的块地址从块状态表中获取当前块,并根据当前字符的码值从当前块中确定当前字符对应的状态值;d4、判断确定的状态值在掩码表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在掩码表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤d2,直至处理完输入的所有字符。
上述方案中,步骤d2所述根据当前字符的码值从最小块地址列表中获得块地址的方法包括统计掩码表当前行的第一列比特位和根据当前字符码值所确定的比特位之间所有值为1的比特位个数,再根据掩码表当前行对应的索引地址和确定的值为1的比特位个数从最小地址列表中获得块地址。
上述方案中,所述生成特征码的状态表的方法包括x1、按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;x2、根据块地址表建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;x3、将块地址表和掩码表的第一行作为当前行;x4、统计块地址表当前行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表当前行中;x5、将掩码表当前行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中;x6、将块地址表和掩码表的下一行作为当前行,返回步骤x4,直至处理完块地址表和掩码表的所有行;将块状态表、掩码表和最小块地址列表一并作为特征码的状态表。
针对本发明提出的第三个发明目的,本发明的技术方案为一种生成特征码状态表的装置,该装置包括块分割模块,按照设置的块大小对原状态表进行分割,根据分割情况在块地址表存储单元中建立块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在块状态表存储单元中建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;块地址表存储模块,用于保存块地址表;块状态表存储模块,用于保存块状态表。
上述方案中,该装置进一步包括掩码映射模块,根据块地址表在掩码表存储模块中建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;统计块地址表每一行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在最小块地址存储模块中建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表对应行中;将掩码表每一行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表对应行所有非缺省块地址依次保存在最小块地址列表中;掩码表存储模块,用于保存掩码表;最小块地址列表存储模块,用于保存最小块地址列表。
针对本发明的第四个发明目的,提出的技术方案为一种匹配特征码的装置,该装置包括块地址表存储模块,用于保存块地址表;块状态表存储模块,用于保存块状态表;字符缓冲模块,用于保存输入的字符;第一匹配模块,用于根据字符缓冲模块中输入字符的码值从块地址表确定所属块的块地址,根据块地址从块状态表中获取字符所属块,并根据字符的码值从字符所属块中确定对应的状态值;判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
针对本发明提出的第四个发明目的,本发明的另一个技术方案为一种匹配特征码的装置,该装置包括块状态表存储模块,用于保存块状态表;掩码表存储模块,用于保存掩码表;最小块地址列表存储模块,用于保存最小块地址列表;字符缓冲模块,用于保存输入的字符;第二匹配模块,根据字符缓冲模块中字符的码值从掩码表确定对应的比特位,判断比特位是否为0,如果是,则根据掩码表对应的索引地址从最小块地址列表中获得块地址;否则,根据字符的码值从最小块地址列表中获得块地址;根据获得的块地址从块状态表中确定字符对应的状态值,判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
综上所述,本发明提出的一种生成特征码状态表、匹配特征码的方法和装置,按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;生成的块状态表和块地址表一并作为特征码的状态表。这样,由于原状态表中大量重复的块仅在块状态表保存一份,而采用块地址进行映射,从而可以达到减少占用存储空间的目的。


图1是本发明生成块状态表和块地址表方法实施例一的流程图;图2是本发明生成块状态表和块地址表方法实施例二的流程图;图3是本发明利用块状态表和块地址表实现匹配特征码方法实施例的流程图;图4是本发明将块地址表分解为掩码表和最小块地址列表的方法实施例的流程图;图5是本发明利用块状态表、掩码表和最小块地址列表实现匹配特征码方法实施例的流程图;图6是本发明生成特征码状态表装置实施例一的结构示意图;图7是利用块地址表和块状态表对特征码进行匹配的装置实施例;图8是利用块状态表、掩码表、最小块地址列表对特征码进行匹配的装置实施例。
具体实施例方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合附图及具体实施例对本发明作进一步地详细描述。
实际应用中,在用于保存输入字符和输入状态对应关系的状态表中,某些状态值组成的块常常重复出现。比如在表一所示的状态表中存在249个相同的块,即8个状态值连续为0的块,如第0行的第0~7列所组成的块、第0行的第8~15列所组成的块等等。在这种情况下,为了减少状态表占用的存储空间,可以将用于保存输入字符和输入状态对应关系的原状态表按照块大小进行分割,将分割出的每一类块单独保存在块状态表中,即重复出现的块仅保存一次,并为每一类块分配各自的块地址。同时,建立与原状态表块分割情况对应的块地址表,将每一个块对应的块地址保存在块地址表相应的单元中。这样,原状态表就可以分解为块状态表和块地址表。由于原状态表分割的每一类块在块状态表中仅保存一份,而大量重复的块可以用块地址来映射,从而大大减少了存储空间。
图1是本发明生成块状态表和块地址表实施例一的流程图。如图1所示,本实施例可以包括以下步骤步骤101按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割。
本步骤所述的块大小可以根据原状态表保存状态值的情况来确定。但一般来说,由于原状态表为256列,为了便于完整分割原状态表,也便于与块地址表对应,可以将一行连续8列作为一个块,即将256列、n行的原状态表分割为32n个块。当然,也可以将原状态表按照其它块大小进行分割,比如一行4列作为一个块、一行16列作为一个块、或两行8列作为一个块等等。总之,如何分割可以根据原状态表的实际情况确定,此处不再一一列举。
步骤102根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元。
步骤103将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址。
将原状态表进行分割后,可以将分割出的相同的块作为一类,每一类块在块状态表中仅保存一份。也就是说,如果原状态表共分割出32n个块,其中有8类不同的块,那么,块状态表仅保存8个块即可。
实际应用中,实现本步骤的方法可以具体为a1、将原状态表第一行作为当前行,将原状态表第一行第一列的块作为当前块;a2、判断块状态表中是否存在与当前块相同的块,如果存在,则将原状态表当前行的下一个块作为当前块;否则,将当前块保存在建立的块状态表中并分配块地址,再将原状态表的下一个块作为当前块;返回执行步骤a2,直至处理完原状态表当前行所有的块;a3、将原状态表的下一行作为当前行,将原状态表当前行第一列的块作为当前块;返回执行步骤a2,直至处理完原状态表所有行。
这里,是将原状态表按照行的顺序来进行处理所有的块。实际应用中,也可以按照列的顺序来进行处理。比如将原状态表第一行第一列作为第一个块,将原状态表第二行第一列的块作为第二个块,并依此类推,至于按照何种顺序来处理则可以由应用本发明方案的用户确定,此处不再赘述。
步骤104将原状态表每一个块对应的块地址保存在块地址表相应的单元中。
将每一类块保存在块状态表之后,还需要将原状态表中每一个块对应的块地址保存在块地址表中。比如原状态表第1行第1列的块、第3行第5列的块相同,属于同一类块,并且在块状态表中对应的块地址为2。那么,块地址表相应的第1行第1列的单元,以及第3行第5列的单元都应该保存2这个块地址。
另外,本实施例是先利用步骤103生成块状态表,再利用步骤104生成块地址表。但实际应用中,步骤103和步骤104也可以并行处理。比如在步骤103中,每处理完一个块,就可以将该块对应的块地址保存在块地址表中。至于究竟按照何种顺序生成状态表和块地址表,也可以由应用本发明方案的用户自行确定,此处不再赘述。
经过步骤101~步骤104,原状态表可以分解为块状态表和块地址表,由于原状态表分割的每一类块在块状态表中仅保存了一份,而大量重复的块则用块地址替代,从而大大减少了存储空间。
为了更好地说明本发明方案,下面用方法实施例二进行详细描述。
在生成块状态表和块地址表方法实施例二中,假设原状态表仍然如表一所示,一行连续8列为一个块。
图2是生成块状态表和块地址表实施例二的流程图。如图2所示,本实施例可以包括以下步骤步骤201按照设置的块大小对原状态表进行分割。
本步骤中,由于一行连续8列为一个块,所以可以将表一分割为32×8个块。
步骤202建立块状态表,并根据原状态表的分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元。
本步骤中,建立的块状态表和块地址表为空表,其格式可以分别如表二和表三所示

表二其中,表二中的每一行表示一个块和对应的块地址。


表三其中,表三的每一个单元与原状态表分割后的每一个块对应。
步骤203设置原状态表的第一行为当前行,原状态表第一行第一列的块为当前块。
步骤204判断原状态表当前行的当前块是否已经保存在块状态表中,如果已经保存,则执行步骤205;否则,执行步骤206。
步骤205将块状态表中对应的块地址保存在块地址表相应的单元中,再执行步骤207。
步骤206将原状态表当前行的当前块保存在块状态表中并分配块地址,将分配的块地址保存在块地址表相应的单元中。
步骤207~步骤208判断是否处理完原状态表当前行所有的块,如果处理完,则执行步骤209;否则,将原状态表当前行的下一个块作为当前块,返回步骤204。
步骤209~步骤210判断是否处理处理完原状态表所有行,如果处理完,则退出本流程;否则,将原状态表的下一行作为当前行,将原状态表当前行第一列的块作为当前块,并返回执行步骤204。
本实施例中,步骤203~步骤210是将原状态表分割出的每一类块保存一份在建立的块状态表中,并分配了对应块地址。但与实施例一不同的是,本实施例在生成块状态表的过程中,还将原状态表每一个块对应的块地址填入块地址表中,即步骤205和步骤206。
应用本实施例后,生成的块状态表和块地址表可以分别如表四和表五所示

表四

表五本实施例中,假设状态值用4个字节表示,原状态表应该占用256×8×4=8K个字节,生成的块状态表占用8×8×4=256个字节,生成的块地址表占用8×32×4=1K个字节,所以,生成的块状态表和块地址表占用的存储空间仅约原状态表16%。所以,在生成块状态表和块地址表之后,如果需要进行匹配特征码,就可以将占用存储空间小的块状态表和块地址表调入内存,直接利用块状态表和块地址表进行匹配,而不再使用原状态表,大大减少了占用的内存。
下面用实施例具体说明如何利用块状态表和块地址表对特征码进行匹配。
图3是利用块状态表和块地址表实现匹配特征码方法实施例的流程图。如图3所示,本实施例可以包括以下步骤步骤301将输入的第一个字符作为当前字符,将块地址表的第一行作为当前行。
步骤302根据当前字符的码值从块地址表当前行确定当前字符所属块的块地址。
如果当前字符用ASCII码表示,实现本步骤的具体方法可以为将当前字符的ASCII码值除以块大小,获得块地址表第一列单元到达保存当前字符所属块地址的单元的距离;再根据块地址表第一列单元到达保存当前字符所属块地址的单元的距离,从块地址表中确定当前字符所属块的块地址。
也就是说,由于原状态表是按照ASCII码的顺序进行排列,并按照块大小进行分割的,所以,如果将字符的ASCII码除以块大小,就可以确定该字符应该属于哪个块,并获得相应的块地址。比如当前字符为“a”,其ASCII码值为97;块地址表的第一行为当前行;块大小为8,即在对原状态表进行分割时,是按照一行连续8列为一个块进行分割的。那么,当前字符“a”的ASCII码值除以块大小应该为12,即块地址表当前行的第一列与保存当前字符所属块地址的单元之间的距离为12,即块地址表的第13列保存有当前字符所属块的块地址“X1”。
步骤303根据块地址从块状态表中获取当前块,并根据当前字符的码值从当前块中确定当前字符对应的状态值。
这里,所述根据当前字符的码值从当前块中确定当前字符对应状态值的方法可以为将当前字符的ASCII码值和块大小进行求模运算,获得当前字符所属块第一个状态值达到当前字符对应状态值的距离;再根据当前字符所属块第一个状态值到达当前字符对应状态值的距离,从当前字符所属块中确定当前字符对应的状态值。
也就是说,由于原状态表是按照ASCII码顺序进行排列,并按照块大小分割的,所以,当确定字符应该属于哪个块之后,还需要根据字符ASCII码除以块大小的余数来确定字符所对应的状态值。这里所述ASCII码除以块大小的余数就是ASCII码对块大小进行求模运算的结果。比如当前字符“a”所属块为块地址“X1”对应的块,包括“01000000”这8个状态值。那么,当前字符“a”的ASCII码值与块大小求模运算的结果应该为1,即当前字符所属块第一个状态值达到当前字符对应状态值的距离为1,即当前字符对应状态值应该为块中的第二个状态值,即“1”。
步骤304~步骤305判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在块地址表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤302,直至处理完输入的所有字符。
与原状态表相似,本实施例中块状态表保存的状态值表示字符输入的下一个状态,即应该在块地址表中转到状态值对应的行。仍然以上述当前字符“a”为例,由于确定当前字符对应的状态值为“1”,则应该将块地址表转到状态值为“1”所对应的行,即块地址表的第二行。当然,由于块地址表的第二行不是表示匹配成功的行,则应该将第二行作为当前行,将输入的下一个字符作为当前字符,并返回步骤302继续执行。
实际应用中,如果分解出块地址表存在大量重复的块地址,还可以将块地址表进一步分解为掩码表和最小块地址列表。也就是说,可以对块地址表的每一行进行统计,将重复次数最多的块地址作为缺省块地址,并将该行的缺省块地址和非缺省块地址分别用比特位“0”和“1”进行表示,以此实现对缺省块地址和非缺省块地址的分类。这样,只需要将每一行的缺省块地址保存一份,并保存所有非缺省块地址即可。
下面用实施例具体说明将块地址表分解为掩码表和最小块地址列表的方法。
图4是将块地址表分解为掩码表和最小块地址列表的方法实施例的流程图。如图4所示,该方法可以包括以下步骤步骤401根据块地址表建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元。
步骤402将块地址表和掩码表的第一行作为当前行。
步骤403统计块地址表当前行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在建立的最小块地址列表中,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表当前行中。
这里,为了明确块地址表每一行的缺省块地址和非缺省块地址保存在最小块地址列表中的位置,可以将保存缺省块地址的位置作为首地址,并记录在掩码表中,所述首地址就是保存缺省地址的索引地址。
步骤404将掩码表当前行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中。
实际应用中,实现本步骤的方法可以具体为b41、将块地址表和掩码表的第一列为当前列;b42、判断块地址表的当前列所保存的块地址是否为缺省块地址,如果是,则将掩码表对应的比特位设置为0;否则,设置为1,并将当前列的块地址保存在最小块地址列表中;b43、将块地址表和掩码表的下一列作为当前列,返回步骤b41,直至处理完块地址表和掩码表当前行的所有列。
根据步骤b41~步骤b43,就可以将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中。本实施例需要将所有非缺省块地址都保存下来,而缺省块地址仅保存一份的原因在于掩码表的比特位只有“0”和“1”两类,而所有缺省块地址都是相同的,可以用一个比特位“0”来表示,而其它非缺省块地址可能各不相同,无法用一个比特位“1”进行区分。在这种情况下,只能将所有非缺省块地址全部保存下来,并利用对应比特位“1”在掩码表中的位置来区分。
步骤405~步骤406判断是否处理完块地址表的所有行,如果是,则退出本流程;否则,将块地址表和掩码表的下一行作为当前行,返回步骤403。
应用本实施例后,可以块地址表进一步分解为掩码表和最小块地址列表,并将块状态表、掩码表和最小块地址列表一并作为特征码的状态表。
如果以表五作为块地址表,应用本实施例方案以后,生成的掩码表如表六所示

表六其中,“状态”、“结果”列的含义仍然与块地址表中相同;“地址”列的对应该行缺省块地址保存在最小块地址列表中的索引地址,即首地址;“掩码”列的每一个比特位对于块地址表表五中的每一个单元,比特位“0”对应的缺省块地址“X0”,而“掩码”列第一行中的比特位“1”对应非缺省地址“X1”,第二行中的比特位“1”对应非缺省地址“X2”,并依此类推。
生成的最小块地址列表可以如表七所示


表七这样,假设原块地址表表五中的每一个块地址用4个字节表示,共占32×8×4=1K字节。分解为掩码表和最小块地址列表之后,仅占184个字节,进一步减少了块地址表占用的存储空间。
此后,当需要匹配特征码时,只需将块状态表、掩码表和最小块地址列表调入内存即可。
当然,由于特征码匹配的状态包括块状态表、掩码表和最小块地址列表,匹配方法与利用决状态表和块地址表的匹配方法不同。下面用实施例对如何利用块状态表、掩码表和最小块地址列表,实现特征码匹配进行详细说明。
图5是利用块状态表、掩码表和最小块地址列表实现匹配特征码的实施例的流程图。如图5所示,本方法实施例可以包括以下步骤步骤501将输入的第一个字符作为当前字符,将掩码表的第一行作为当前行。
步骤502根据当前字符的码值从掩码表当前行确定对应的比特位。
与方法实施例三的步骤302相似,本步骤中根据当前字符的码值可以确定当前字符所属块对应的掩码。比如当前字符为“a”,其ASCII码值为97;掩码表的第一行为当前行;块大小为8,即在对原状态表进行分割时,是按照一行连续8列为一个块进行分割的。那么,当前字符“a”的ASCII码值除以块大小应该为12,即掩码表当前行的第一列与前字符所属块对应的掩码之间的距离为12,即掩码表的第13列为当前字符所属块对应的比特位。
步骤503~步骤505判断确定的比特位是否为0,如果是,则根据掩码表当前行对应的索引地址从最小块地址列表中获得块地址;否则,根据当前字符的码值从最小块地址列表中获得块地址。
这里,如果对应的比特位为“0”,则可以确定当前字符所属块的块地址应该为缺省块地址,直接从掩码表当前行获得保存缺省块地址的索引地址,并根据索引地址从最小块地址列表中获得块地址即可。
如果对应的比特位为“1”,则可以确定当前字符所属块的块地址应该为非缺省块地址,掩码表当前行的索引地址仅仅是一个首地址,还需要根据这个为“1”的比特位在掩码表中的位置从最小块地址列表中获得块地址。具体的方法可以为统计掩码表当前行的第一列比特位和根据当前字符码值所确定的比特位之间所有值为1的比特位个数,再根据掩码表当前行对应的索引地址和确定的值为1的比特位个数从最小地址列表中获得块地址。
也就是说,如果根据当前字符ASCII码值确定的比特位在掩码表当前行中为第n个“1”,则需要在最小块地址列表中,从保存该行缺省块地址的索引地址开始的第n个索引位置处获得块地址。比如当前字符“a”的ASCII码值确定的比特位为当前行的第1个“1”,则从索引地址“Y0”开始的第1个索引位置处,即索引位置“Y1”处获得块地址“X1”。
步骤506根据获得的块地址从块状态表中获取当前块,并根据当前字符的码值从当前块中确定当前字符对应的状态值。
本步骤与利用块状态表和块地址表进行匹配特征码方法中步骤303相同,此处不再赘述。
步骤507~步骤508判断确定的状态值在掩码表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在掩码表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤502,直至处理完输入的所有字符。
针对上述方法,本发明还提出生成特征码状态表的装置以及实现特征码匹配的装置。
图6是本发明生成特征码状态表装置实施例一的结构示意图。如图6所示,该装置包括块分割模块601,按照设置的块大小对原状态表存储模块602中的原状态表进行分割,根据分割情况在块地址表存储模块603中建立块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在块状态表存储模块604中建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;原状态表存储模块602,用于保存原状态表;块地址表存储模块603,用于保存块地址表;块状态表存储模块604,用于保存块状态表。
应用本实施例方案,块分割模块601可以将原状态表分解为块地址表和块状态表,其方法与图1所示的方法实施例一相同,此处不再赘述。此后,就可以直接利用块地址表和块状态表对特征码进行匹配。
当然,生成块地址表和块状态表之后,还可以利用图4所示的方法继续将块地址表分解为掩码表和最小块地址列表。在这种情况下,该装置可以进一步包括掩码映射模块605,根据块地址表在掩码表存储模块606中建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;统计块地址表每一行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在最小块地址存储模块607中建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表对应行中;将掩码表每一行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表对应行所有非缺省块地址依次保存在最小块地址列表中;掩码表存储模块606,用于保存掩码表;最小块地址列表存储模块607,用于保存最小块地址列表。
这样,当掩码映射模块605进一步将块地址表分解为掩码表和最小块地址列表后,就可以直接利用块状态表、掩码表和最小块地址列表对特征码进行匹配。
图7是利用块地址表和块状态表对特征码进行匹配的装置实施例。如图7所示,该装置包括块地址表存储模块701,用于保存块地址表;块状态表存储模块702,用于保存块状态表;字符缓冲模块703,用于保存输入的字符;第一匹配模块704,用于根据字符缓冲模块703中输入字符的码值从块地址表701确定所属块的块地址,根据块地址从块状态表存储模块702中保存的块状态表获取字符所属块,并根据字符的码值从字符所属块中确定对应的状态值;判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
这里,第一匹配模块704就可以利用占用存储空间减少的块地址表和块状态表对特征码进行匹配,其匹配方法的详细情况可以参见图3所示的方法,此处不再赘述。
图8是利用块状态表、掩码表、最小块地址列表对特征码进行匹配的装置实施例。如图8所示,该装置包括块状态表存储模块801,用于保存块状态表;掩码表存储模块802,用于保存掩码表;最小块地址列表存储模块803,用于保存最小块地址列表;
字符缓冲模块804,用于保存输入的字符;第二匹配模块805,根据字符缓冲模块804中字符的码值从掩码表存储模块802中掩码表确定对应的比特位,判断比特位是否为0,如果是,则根据掩码表对应的索引地址从最小块地址列表存储模块803中的最小块地址列表中获得块地址;否则,根据字符的码值从最小块地址列表中获得块地址;根据获得的块地址从块状态表存储模块801的块状态表中确定字符对应的状态值,判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
应用本发明方案,可以将原状态表进行分割,将大量重复的块仅在块状态表中保存一份,并利用对应的块地址表保持与块状态表的映射关系。这样,由于删除了大量重复的块,分解后的块状态表和块地址表可以大大减少占用的存储空间。另外,本发明还可以进一步将块地址表分解为掩码表和最小块地址列表,将大量重复的缺省块地址仅仅在最小块地址列表中保存一份,并利用对应的掩码表保证映射关系,从而使分解后的掩码表和最小块地址表进一步减少占用的存储空间。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种生成特征码状态表的方法,其特征在于,该方法为按照设置的块大小对原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;生成的块状态表和块地址表一并作为特征码的状态表。
2.根据权利要求1所述的方法,其特征在于,所述将原状态表分割出的每一类块保存一份在建立的块状态表中并分配对应块地址的方法包括a1、将原状态表第一行作为当前行,将原状态表第一行第一列的块作为当前块;a2、判断块状态表中是否存在与当前块相同的块,如果存在,则将原状态表当前行的下一个块作为当前块;否则,将当前块保存在建立的块状态表中并分配块地址,再将原状态表的下一个块作为当前块;返回执行步骤a2,直至处理完原状态表当前行所有的块;a3、将原状态表的下一行作为当前行,将原状态表当前行第一列的块作为当前块;返回执行步骤a2,直至处理完原状态表所有行。
3.根据权利要求1或2所述的方法,其特征在于,生成块地址表之后,该方法进一步包括b1、根据块地址表建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;b2、将块地址表和掩码表的第一行作为当前行;b3、统计块地址表当前行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表当前行中;b4、将掩码表当前行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中;b5、将块地址表和掩码表的下一行作为当前行,返回步骤b3,直至处理完块地址表和掩码表的所有行;将块状态表、掩码表和最小块地址列表一并作为特征码的状态表。
4.根据权利要求3所述的方法,其特征在于,所述步骤b4包括b41、将块地址表和掩码表的第一列为当前列;b42、判断块地址表的当前列所保存的块地址是否为缺省块地址,如果是,则将掩码表对应的比特位设置为0;否则,设置为1,并将当前列的块地址保存在最小块地址列表中;b43、将块地址表和掩码表的下一列作为当前列,返回步骤b41,直至处理完块地址表和掩码表的所有列。
5.一种匹配特征码的方法,其特征在于,事先生成特征码的状态表,所述状态表包括块状态表和块地址表;该方法为c1、将输入的第一个字符作为当前字符,将块地址表的第一行作为当前行;c2、根据当前字符的码值从块地址表当前行确定当前字符所属块的块地址;c3、根据块地址从块状态表中获取当前字符所属块,并根据当前字符的码值从当前字符所属块中确定对应的状态值;c4、判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在块地址表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤c2,直至处理完输入的所有字符。
6.根据权利要求5所述的方法,其特征在于,所述字符的码值为ASCII码值,步骤c2所述根据当前字符的码值从块地址表当前行确定当前字符所属块的块地址方法为将当前字符的ASCII码值除以块大小,获得块地址表第一列单元到达保存当前字符所属块地址的单元的距离;再根据块地址表第一列单元到达保存当前字符所属块地址的单元的距离,从块地址表中确定当前字符所属块的块地址。
7.根据权利要求5所述的方法,其特征在于,步骤c3所述根据当前字符的码值从当前字符所属块中确定当前字符对应状态值的方法包括将当前字符的ASCII码值和块大小进行求模运算,获得当前字符所属块第一个状态值达到当前字符对应的状态值的距离;再根据当前字符所属块第一个状态值到达当前字符对应的状态值的距离,从当前字符所属块中确定当前字符对应的状态值。
8.根据权利要求5至7任一项所述的方法,其特征在于,所述生成特征码状态表的方法包括按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;生成的块状态表和块地址表一并作为特征码的状态表。
9.一种匹配特征码的方法,其特征在于,事先生成特征码的状态表,所述状态表包括块状态表、掩码表和最小块地址列表;该方法为d1、将输入的第一个字符作为当前字符,将掩码表的第一行作为当前行;d2、根据当前字符的码值从掩码表当前行确定对应的比特位,判断比特位是否为0,如果是,则根据掩码表当前行对应的索引地址从最小块地址列表中获得块地址;否则,根据当前字符的码值从最小块地址列表中获得块地址;d3、根据获得的块地址从块状态表中获取当前块,并根据当前字符的码值从当前块中确定当前字符对应的状态值;d4、判断确定的状态值在掩码表中所对应的行是否为表示匹配成功的行,如果是,则退出本流程;否则,将确定的状态值在掩码表中所对应的行作为当前行,将输入的下一个字符作为当前字符,并返回步骤d2,直至处理完输入的所有字符。
10.根据权利要求8所述的方法,其特征在于,步骤d2所述根据当前字符的码值从最小块地址列表中获得块地址的方法包括统计掩码表当前行的第一列比特位和根据当前字符码值所确定的比特位之间所有值为1的比特位个数,再根据掩码表当前行对应的索引地址和确定的值为1的比特位个数从最小地址列表中获得块地址。
11.根据权利要求9或10所述的方法,其特征在于,所述生成特征码的状态表的方法包括x1、按照设置的块大小对用于保存输入字符和输入状态对应关系的原状态表进行分割,根据分割情况建立对应的块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;x2、根据块地址表建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;x3、将块地址表和掩码表的第一行作为当前行;x4、统计块地址表当前行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表当前行中;x5、将掩码表当前行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表当前行所有非缺省块地址依次保存在最小块地址列表中;x6、将块地址表和掩码表的下一行作为当前行,返回步骤x4,直至处理完块地址表和掩码表的所有行;将块状态表、掩码表和最小块地址列表一并作为特征码的状态表。
12.一种生成特征码状态表的装置,其特征在于,该装置包括块分割模块,按照设置的块大小对原状态表进行分割,根据分割情况在块地址表存储模块中建立块地址表,所述原状态表的每一个块对应块地址表的每一个单元;将原状态表分割出的每一类块保存一份在块状态表存储单元中建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中;原状态表存储模块,用于保存原状态表;块地址表存储模块,用于保存块地址表;块状态表存储模块,用于保存块状态表。
13.根据权利要求12所述的装置,其特征在于,该装置进一步包括掩码映射模块,根据块地址表在掩码表存储模块中建立对应的掩码表,掩码表中的每一个比特位对应块地址表中的每一个单元;统计块地址表每一行中各块地址的数量,将数量最多的块地址作为缺省块地址保存在最小块地址存储模块中建立的最小块地址列表,并将最小块地址列表中保存缺省块地址的索引地址保存在掩码表对应行中;将掩码表每一行所有缺省块地址对应的比特位设置为0,所有非缺省块地址对应的比特位设置为1,并将块地址表对应行所有非缺省块地址依次保存在最小块地址列表中;掩码表存储模块,用于保存掩码表;最小块地址列表存储模块,用于保存最小块地址列表。
14.一种匹配特征码的装置,其特征在于,该装置包括块地址表存储模块,用于保存块地址表;块状态表存储模块,用于保存块状态表;字符缓冲模块,用于保存输入的字符;第一匹配模块,用于根据字符缓冲模块中输入字符的码值从块地址表确定所属块的块地址,根据块地址从块状态表中获取字符所属块,并根据字符的码值从字符所属块中确定对应的状态值;判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
15.一种匹配特征码的装置,其特征在于,该装置包括块状态表存储模块,用于保存块状态表;掩码表存储模块,用于保存掩码表;最小块地址列表存储模块,用于保存最小块地址列表;字符缓冲模块,用于保存输入的字符;第二匹配模块,根据字符缓冲模块中字符的码值从掩码表确定对应的比特位,判断比特位是否为0,如果是,则根据掩码表对应的索引地址从最小块地址列表中获得块地址;否则,根据字符的码值从最小块地址列表中获得块地址;根据获得的块地址从块状态表中确定字符对应的状态值,判断确定的状态值在块地址表中所对应的行是否为表示匹配成功的行,如果是,则输出匹配成功的信息;否则,继续匹配字符缓冲模块中下一个字符,直至处理完输入的所有字符。
全文摘要
本发明提供一种生成特征码状态表、匹配特征码的方法和装置,具体为按照设置的块大小对原状态表进行分割,根据分割情况建立对应的块地址表;将原状态表分割出的每一类块保存一份在建立的块状态表中,并为每一类块分配对应的块地址;将原状态表每一个块对应的块地址保存在块地址表相应的单元中。应用本发明方案,由于大量重复的块仅在块状态表保存一份,从而可以大大减少占用的存储空间。
文档编号G06F17/30GK101094230SQ20071011853
公开日2007年12月26日 申请日期2007年7月9日 优先权日2007年7月9日
发明者常利民 申请人:杭州华三通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1