加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

存储数据结构的有效且简单的方法是什么?

发布时间: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 0x09 =有效载荷为9个字符
>“Bananarama”

> 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");

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读