存储数据结构的有效且简单的方法是什么?
发布时间:2020-12-16 06:54:35 所属栏目:百科 来源:网络整理
导读:我想为NBT(命名二进制标签)结构编写一个解析器.格式如下所示: TAG_Compound("hello world"): 1 entries{ TAG_String("name"): Bananrama} 并在内存(或它存储的文件)中以十六进制视图: 0000000: 0a 00 0b 68 65 6c 6c 6f 20 77 6f 72 6c 64 08 00 ...hello
我想为NBT(命名二进制标签)结构编写一个解析器.格式如下所示:
TAG_Compound("hello world"): 1 entries { TAG_String("name"): Bananrama } 并在内存(或它存储的文件)中以十六进制视图: 0000000: 0a 00 0b 68 65 6c 6c 6f 20 77 6f 72 6c 64 08 00 ...hello world.. 0000010: 04 6e 61 6d 65 00 09 42 61 6e 61 6e 72 61 6d 61 .name..Bananrama 0000020: 00 . > 0x0a = TAG_Compound > 0x00 0x0b =名称长度为11个字符 > 0x08 = TAG_String > 0x00 0x04 =名称长度为4个字符 > 0x00 = TAG_End 随着越来越多的嵌套TAG_Compounds(如树结构),它会变得更加复杂. 现在我的问题并不是解析格式,这很简单.我更愿意知道如何有效地,更重要的是,方便地存储它以供以后使用. 我知道我无法获得一定程度的轻松 tags["hello world"]["name"] = "Bananrama" 但是什么是保存它易于使用的最佳方式?我想到了一个nbt_compound结构(因为每个NBT树至少有一个根化合物),让它存储它有多少个子节点,并包含一个nbt_value结构数组,用于存储该值的类型和内容.这是一个好主意吗? 编辑:完整的规格可以看到here 解决方法
我确信这段代码已被破坏,但这个想法正是我想要传达的.我想我会使用Tag对象,比如
struct TagHeader { TagType type; // Enum of COMPOUND,STRING,etc char *name; } struct TagCompound { TagHeader header; int nelems; void *children; } struct TagString { TagHeader hearder; char *value; } 有功能,喜欢 void *get_value(void *root,char *name) { int i; if (! root) return NULL; if (((TagHeader *) root)->type == COMPOUND) { TagCompound *c = (TagCompound *)root; for (i = 0; i < c->nelems; i++) { if (strcmp(((TagHeader *) c->values[i])->name,name) == 0) { return c->values[i]; } } return NULL; } else if ( /* handle other tag Types */ ) { } return NULL; } 然后访问它像: get_value(get_value(root,"Hello World"),"name"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读