适用于解析文件的数据组织

时间:2013-07-02 16:53:03

标签: c parsing data-structures

现在我正在研究解析nmap-os-db文件的项目,该文件是NMap源代码的一部分。它包含与此类似的条目:

# Apple Time Capsule, firmware 7.3.1
# Apple Airport Extreme
# Linux 2.6.25.18-0.2-default #1 SMP 2008-10-21 16:30:26 +0200 x86_64 x86_64 x86_64 GNU/Linux
Fingerprint Apple AirPort Extreme WAP or Time Capsule NAS device (NetBSD)
Class Apple | embedded || storage-misc
Class Apple | embedded || WAP
CPE cpe:/h:apple:airport_extreme
SEQ(SP=CC-D8%GCD=1-6%ISR=D7-E1%TI=I%II=I%SS=S%TS=0)
OPS(O1=M5B4NW0NNT01SNN%O2=M5B4NW0NNT01SNN%O3=M5B4NW0NNT01%O4=M5B4NW0NNT01SNN%O5=M5B4NW0NNT01SNN%O6=M5B4NNT01SNN)
WIN(W1=8000%W2=8000%W3=8000%W4=8000%W5=8000%W6=8000)
ECN(R=Y%DF=Y%T=3B-45%TG=40%W=8000%O=M5B4NW0SNN%CC=N%Q=)
T1(R=Y%DF=Y%T=3B-45%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
T3(R=Y%DF=Y%T=3B-45%TG=40%W=8000%S=O%A=S+%F=AS%O=M5B4NW0NNT01SNN%RD=0%Q=)
T4(R=Y%DF=N%T=3B-45%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T5(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=N%T=3B-45%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T7(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
U1(DF=N%T=FA-104%TG=FF%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=I%RUCK=G%RUD=G)
IE(DFI=N%T=FA-104%TG=FF%CD=S)

我的要求是在解析此文本文件后,其中大约有3000个条目与上面的内容非常相似。我需要能够进行汇总统计,就像打印出SEQ线内SP测试的等号右边的每个可能值以及它的相对百分比一样。我还需要能够在必要时调出整个条目,并可能将它们分组到类似的产品中,例如Apple与Apple,Microsoft与Microsoft等。

下面我有我所做的结构的代码,让我完成摘要和个人入口要求。我解析信息没有问题,只想知道是否有更好的方法来跟踪它们。

//Holds a test value
typedef struct
{
    char *name;
    int numberOccurences;
    void *nextValue;
} Value;

//Holds all the possible values for a given test
typedef struct
{
    char *name;
    Value *value_head;
    int totalOccurences;
    void *nextTest;
} Test;
//Create probe type to hold the all the possible tests for a given probe
typedef struct
{
    char *name;
    Test *test_head;
    void *nextProbe;
} Probe;


typedef struct
{
    char *classLine;
    char *manufacturer;
    char *product;
    void *nextClass;
} PrintClass;

//Create type to hold all the gathered fingerprints
typedef struct
{
    char *name;
    //char **class;
    //int numClass;
    PrintClass *class_head;
    char **cpe;
    int numCPE;
    char **probes;
    int numProbes;
    void *nextPrint;
} Fingerprint;

typedef struct
{
    char *name;
    void *nextProduct;
} Product;

typedef struct
{
    char *manufacturer;
    Product *product_head;
    void *nextGroup;
} PrintGroup;

我的主要问题是我担心我所拥有的东西可能比它需要的更麻烦,我可能过于专注于使其面向对象。我只是想知道是否有人有更聪明的方式,或者我可能能够改进或压缩它的区域可能是一种类型。我希望我明白我的要求。

如果从代码中不清楚,我有指纹的结构,跟踪文件中的所有单个条目,我有探针结构和附加到它的所有结构收集统计信息每个探针(SEQ,OPS等)的测试(SP,GCD,ISR等)和测试值。最后,我有印刷小组来跟踪印刷系列,例如Apple,Microsoft等,尽管这部分仍在进行中。

0 个答案:

没有答案