2010-08-08 3 views
4

NBT (Named Binary Tags) 구조에 대한 파서를 작성하고 싶습니다. 포맷은 다음과 같이 표현된다 : 데이터 구조를 저장하는 효율적이고 간단한 방법은 무엇입니까?

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 자 길이
    • "hello world"
  • 0x08 = TAG_String
    • 0x00 0x04 = 이름
    • "바나나"긴 4 자
    • "이름"
    • 0x00 0x09 = 페이로드는 9 자
  • 0x00 = TAG_END

트리 구조와 같이 중첩 된 TAG_Compound이 점점 더 복잡해질 수 있습니다.

제 질문은 형식을 구문 분석하는 것과 정확히 같지 않습니다. 정말 쉽습니다. 나는 오히려 얼마나 효율적이고 더 중요한가에 대해 알고 싶다. convenietly 나중에 사용하기 위해 보관.

은 내가

tags["hello world"]["name"] = "Bananrama" 

하지만 사용하기 쉽게 유지하면서 보관하는 가장 좋은 방법입니다 같은 용이성의 정도를 얻을 수있어? 내가 nbt_compound 구조 (모든 NBT 트리에 적어도 하나의 루트 컴파운드가 있기 때문에)에 대해 생각했다. 얼마나 많은 자식을 저장하고 그 값의 유형과 내용을 저장하는 nbt_value 구조체의 배열을 포함하게했다. 그거 좋은 생각이야?

편집은 : 전체 사양은

+0

당신은 단지 그것을 저장하거나 만드시겠습니까 : 나는 그런 다음 원하는 액세스

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; } 

처럼 기능으로

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; } 

처럼 태그 객체를 사용하는 것이 생각/수정도? –

+0

생성 또는 수정하지 않고 단지 정보를 읽거나 가져 오는 것 – LukeN

+0

이미 구문 분석 할 코드가 있다면 얻으면서 저장하지 않으시겠습니까? 별도의 serialize/deserialize 코드를 작성할 필요가 없습니다. 이것은 나에게 매우 편리합니다 .--). –

답변

1

이 코드가 깨진 확신 here을 볼 수 있지만, 아이디어는 내가 전달하려고 것입니다.

get_value(get_value(root, "Hello World"), "name"); 
+0

매우 가까이에서 생각했습니다. 감사합니다. :) – LukeN

관련 문제