请 教 一个关于状态机的东西? 或者是模式匹配字符串列表

Kvci 2006-05-10 01:05:09
各位大虾,问个东西:
有一字符串数组,里面有若干个短字符串.
现在要在一个长字符串里检测是否包含以上字符串,要检测出来,并知道是包含哪个(可以有多个),
用C/C++都可以
如果采用笨点的办法,就是对每个短字符串都利用模式匹配来检测,有多少个短字符串就检测多少次.现在想问的是有没有更好的办法?
学过编译原理,知道里面有个什么状态机的东西,可以只扫描一次就检测完所有关键字.
但是小弟对那东西不熟悉,没学好,那东西也有点伤脑筋
哪未有没有这方面的文章?或者演示代码?C/C++都可以
最好是有个这样的函数:
传2个参数进去,一个是长字符串地址(或CString变量),另一个是短字符串地址.
返回值:
返回-1表示不包含任何关键字
若包含关键字,则返回其在短字符串数组里的序号.
谢谢拉!

...全文
340 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
laomai 2006-05-13
  • 打赏
  • 举报
回复
但是snort的检索效率肯定比你的快,呵呵
Kvci 2006-05-12
  • 打赏
  • 举报
回复
看了一些snort源代码分析的文章和书
看到下面几点:
1、Snort是基于Libcap的
2、有个content-list 选项,后面接存储关键字的文件名,
处理这个选项的函数是void ParselListFile(char *rule,char *file);

[其基本过程是读取content-list文件中的每一行,并将其转换为一条规则,送往解释器。]

上面的话见《黑客入侵防护系统源代码分析》第6章-Snort系统源代码分析 Page 387-Page 388


//////////////////////////////////////////////
snort一个非常成功的思想是利用了plugin机制,规则处理函数并非固定在
源程序中,而是根据每次运行时的参数设定,从规则文件中读入规则,再把每个
规则所需要的处理函数挂接到链表上。
实际检测时,遍历这些链表,调用链表上相应的函数来分析。
/////////////////////////////////////////////
上面的话是一篇snort源代码分析文章里说的
http://macrosea.blogchina.com/

照这样说的话,snort的内容检测也是类似与上面的,对每个关键字规则扫描一次
效率并没提高啊



laomai 2006-05-11
  • 打赏
  • 举报
回复
你QQ里直接喊我吧,呵呵。有些东西不方便公开讨论:-(
Kvci 2006-05-11
  • 打赏
  • 举报
回复
//////////////////////////////////////////////
snort一个非常成功的思想是利用了plugin机制,规则处理函数并非固定在
源程序中,而是根据每次运行时的参数设定,从规则文件中读入规则,再把每个
规则所需要的处理函数挂接到链表上。实际检测时,遍历这些链表,调用链表上
相应的函数来分析。
/////////////////////////////////////////////
上面的话是一篇snort源代码分析文章里说的
http://macrosea.blogchina.com/

照这样说的话,snort的内容检测也是类似与上面的,对每个关键字规则扫描一次
效率并没提高啊
Kvci 2006-05-11
  • 打赏
  • 举报
回复
依据哪个建立哈希表?
Kvci 2006-05-11
  • 打赏
  • 举报
回复
呵呵
村长,上次QQ里就是要问你这个东西,
没想到你自己送上门来了
哈哈
这个是我的毕业设计,我猜那我老师是因为他的公司需要这方面的东西才叫我做这个题目的,全名叫做<局域网信息安全系统>,就是要防止公司文件信息被泄密出去
那就要用到关键字过滤
采用类似哈希表的思路>???
能不能具体点啊?村长
laomai 2006-05-10
  • 打赏
  • 举报
回复
提示楼主一点,可以考虑采用类似哈希表的思路
laomai 2006-05-10
  • 打赏
  • 举报
回复
呵呵,这是楼主的毕业设计还是商业项目?
Kvci 2006-05-10
  • 打赏
  • 举报
回复
楼上的
先谢谢
不过字符串查找的算法我还是会,KMP也会,现在是要找一个高效点的算法,因为这个要用到网络数据包内容过滤里,一秒可能都要检测几百次这个过程.
所以效率提高一点都可以使那整个程序效率提高很多.
这里的关键点在于他是要检测多个字符串,并且那些字符串是随时可以设置的,所以不能定死了
chenhu_doc 2006-05-10
  • 打赏
  • 举报
回复
//求子串位置的定位函数index(***,***,int **)

#include <iostream>
#include <string>

using namespace std;

int index(const char *res, const char *str, int pos)
{
/* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符

起存在和串 T 相同的子串,则称匹配成功,返回第一个

这样的子串在串 S 中的下标,否则返回 -1 */
int i = pos, j = 0;
while ( res[i+j] != '\0'&& str[j] != '\0')

if ( res[i+j] == str[j] )
j ++; // 继续比较后一字符
else
{
i ++; j = 0; // 重新开始新的一轮匹配
}

if ( str[j] == '\0')
return i+1; // 匹配成功 返回下标
else
return -1; // 串S中(第pos个字符起)不存在和串T相同的子串
}


int main()
{
char res[100];
char str[20];

cout<<"input the context to be matched: "<<endl;
cin.getline(res,100,'\n');

cout<<"input the key character:"<<endl;
cin.getline(str,20,'\n');

cout <<res<<endl;
cout <<str<<endl;

int position = -1; //want to specify this variable, use cin....
int index_=position;
int count=0;
do
{
index_ = index(res, str, index_);
if( -1 == index_ )
cout<<"so now,there is no more matching position"<<endl;
else
{
count++;
cout <<"the "<<count<<" matching characters: "<< index_<<endl;
}
}while(index_ != -1);

return 0;
}

///献丑。。。。。
nasi00 2006-05-10
  • 打赏
  • 举报
回复
这个最高效的方法应该是用Trie,查查资料吧
内容概要:本文围绕基于PI双闭环解耦控制的三相电压型PWM整流器在第四象限运行的仿真研究展开,重点分析其在电流反向流动工况下的控制性能。通过Simulink搭建系统模型,采用电压外环与电流内环构成的双闭环PI控制策略,并引入d-q轴解耦环节以消除交叉耦合影响,实现对整流器在能量回馈状态下的高精度、稳定控制。研究涵盖了系统数学建模、控制器参数设计、解耦算法实现及动态响应仿真验证,充分展示了该控制方法在抑制扰动、提升系统鲁棒性方面的有效性。; 适合人群:电力电子、电气工程及其自动化等相关专业的研究生、科研人员及从事新能源变流器、电能质量治理或工业传动系统开发的工程技术人员;具备自动控制理论基础和Simulink仿真能力者更佳。; 使用场景及目标:①深入掌握三相电压型PWM整流器的工作原理及其在不同运行象限的能量流动特性;②理解并实践PI双闭环控制系统的设计思路与参数整定方法;③学习d-q坐标系下电流解耦控制的实现机制;④熟练运用Simulink进行电力电子系统建模与仿真分析;⑤为实际工程中实现高效能量双向变换提供理论依据与技术参考。; 阅读建议:建议结合Simulink环境同步搭建模型,细致分析各模块的信号流向与控制逻辑,重点关注电流内环的动态跟踪能力和电压外环的稳态调节性能,可通过改变负载突变、电网电压波动等条件进行对比实验,进一步评估系统的抗干扰能力与稳定性表现。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧