我正在读取一个二进制文件,其中一个字节定义了一种数据类型。
通常:
0x13 => FOO
0x14 => BAR
但是,实际上,可以有多个相同类型的定义,然后在其他地方定义真正的类型,但它并不总是可访问的。因此,如果没有定义子规范,我想打印所有可能性。
例如:
0x13 => FOO
0x14 => BAR
0x14 => BAZ <-- also "type" 0x14
0x15 => XEN
为了存储类型定义和描述,我有一个格式为:
struct data_def {
char id;
char *name;
char *desc;
...
};
如果可能的话,我会有一个数组,如下所示:
static const struct data_def data_db[][] = {
...
} /* index 0x13 */
{0x13, "FOO", "This is foo", ...}
}, /* index 0x14 */
{0x14, "BAR", "This is bar", ...},
{0x14, "BAZ", "This is baz", ...}
}, /* index 0x15 */
{0x15, "XEN", "This is xen", ...}
}
}
为了这样data_db[0x14][1].name == BAZ
,等等。
但是AFAIK这是不可能的。或者是吗?(C89)。
我正在寻找另一种方法来做到这一点。正在考虑这样的事情:
static const struct data_def data_db[] = {
...
{0x13, "FOO", "This is foo", ...},
{0x14, "BAR", "This is bar", ...},
{0x14, "BAZ", "This is baz", ...},
{0x15, "XEN", "This is xen", ...}
}
然后有一个查找表,就像每个第一个条目开始的位置一样。当然,这也可以通过 looping 动态创建data_db
,但宁愿静态定义它(我认为 - 我还没有决定):
static const char data_index[] {
...
0x20, /* at index 0x13 of data_index */
0x21, /* at index 0x14 of data_index */
0x23, /* at index 0x15 of data_index */
}
通过执行以下操作,可以打印(或其他):
while (data_db[data_index[0x14 + i]].id == 0x14) {
print data_db[data_index[0x14 + i]].name
++i
}
有没有更好的方法来解决这个问题?我想这是以前在类似情况下已经做过十亿次的事情。我宁愿不使用标准库之外的任何库,因为这最终只是程序的一小部分,其余代码也是“免费的”。