<疯狂的程序员>里 绝影很羡慕别人把算法做成动态库 带在身边可以一直用
今天本大小姐就来实践一下这一灰常不错滴想法 AC是大三写的 现在忽然又要用 做了一点小改进 以前没带传进状态做参数 这大大的浪费了AC的高智 然后把预处理的函数去掉了 一切内容敏感~
PS.做成动态库还有一大好处就是可以在python里调用 可谓简单又方便 python里没有short类型 如果要写checksum都有些费劲 而且这样一些关键的算法可以由C实现 而捕包都交给pcap一句搞定好了 我怀疑如果有人写个包把libpcap再封装一下 在C里像dpkt/pcap那样用 一定巨受欢迎了~.~
话说方法是这样滴:
先把包含函数的.c编译成.so共享库: gcc -shared -o libfoo.so foo.c
然后在python中import ctypes ,加载函数库: libfoo=ctypes.cdll.LoadLibrary('./libfoo.so')
建树: libfoo.create()
每次ac: next=libfoo.foo(ctypes.create_string_buffer(str),next)
keys.txt: 用来存放关键字/特征码(总觉得... 特征码这名儿挺帅的...)
python真是将'一切皆对象'这句圣旨贯彻到家了 而C中却无对象 只能传进字符串 此时字符串作参数成了大问题 于是ctypes脚踏一缕青烟 身批万丈霞光的出现了 拯救了绝望中的我 用其中的create_string_buffer创建一个可读可写的缓冲区 可将str对象转成字符串传入C 虽然官方说法是'创建' 而且我也一度信以为真它是创建在str之外的另外一片地儿 实际上这个缓冲区与str是同一片地方 在C中对其作的修改在python中都有效 ctypes真是个不错滴东东 如果str不是ascii串 可以用str()先强转一下 还有一个c_char_p(好像叫这个) 是用来创建一个只读缓冲区的 用法都差不多
这样 从C到python的问题就都解决了 有一点小不爽的就是类型 python里的类型我还不是很习惯 动不动就一个大LONG 一旦将类型不同的东西一起加 那后果不是一般严重
至少没有子串检索不到的BUG 自恋的觉得还是蛮好用的
阅读(1426) | 评论(0) | 转发(0) |