Laden...

Problem beim auslesen einer Datei

Erstellt von Andre4tw vor 16 Jahren Letzter Beitrag vor 16 Jahren 4.028 Views
A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren
Problem beim auslesen einer Datei

Hallo zusammen!

Ich stehe im Moment vor einer Wand und komme absolut nicht weiter. Es geht um eine *.wdb Datei die ich auslesen möchte diese enthält Informationen zu Gegenständen aus einem Spiel allerdings muss sie wohl erst umgewandelt werden.

Auf dieser Seite gibt es Informationen zu dieser Datei
http://wowdev.org/wiki/index.php/Itemcache.wdb

Ich habe die Datei auch mal an gehangen damit mir euch einen Überblick verschaffen könnt wie ich die Informationen die dort auf der Seite stehen herausbekommen könnte. Weiß echt nicht weiter! Danke schon mal für eure Antworten.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

siehe [Hinweis] Wie poste ich richtig? Punkt 4.

herbivore

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

ich suche ja keine kompletten Quellcode ich suche nur einen Ansatz wie ich das Ganze angehen könnte. 🙂

MfG
Andre

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

ich meinte auch folgenden Satz aus [Hinweis] Wie poste ich richtig? Punkt 4:

Gebt uns andersherum auch nicht euren kompletten Quellcode und fragt wo der Fehler ist.

Sehe jetzt aber jetzt erst, dass es die Daten-Datei und nicht der Quellcode ist. Trotzdem läuft deine Frage im Prinzip auf das gleiche hinaus. Du gibst uns deine Aufgabe, damit wir sie lösen (und sei es nur vom Ansatz her). Es ist hier im Forum angesagt, möglichst konkrete Fragen zu stellen. Damit erhöhst du auch die Chance einer Antwort.

Außerdem hast du doch bestimmt schon einiges probiert. Du solltest schreiben was alles und an welcher Stelle du gegen die Wand gelaufen bist.

herbivore

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hi,

ich habe bis jetzt folgendes versucht um an die Daten zu kommen.

StreamReader Reader = new StreamReader("C:\\Programme\\World of Warcraft\\Cache\\WDB\\deDE\\itemcache.wdb");

System.Text.Encoding encoding = System.Text.Encoding.Default;
byte[] WDBByte = encoding.GetBytes(Reader.ReadToEnd());

foreach (byte WDBEntrie in WDBByte)
{
    string WDBINFO = WDBEntrie.ToString();
}

Aber ich erhalte nur die Zahlen als String da ist das Problem da auch auf der im ersten Beitrag gelinkten Seite steht dass das Format ins byte Format gebracht ist und die Einträge als Uint32 und string angegeben sind habe ich so Versucht zu gucken ob ich Gegenstandsnamen aus der Datei herausbekomme aber wie gesagt sind es alles Zahlen. Und ich bekomme einfach nicht an die Daten habe es auch bereits mit Convert versucht leider auch ohne Ergebnis.

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

ok, dann sollte [Tutorial] Alles über Dateien 2.0 einen Blick wert sein.

herbivore

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

danke für die Antwort, leider hat mich dieser Artikel nicht weiter gebracht weil dort nur die Allgemeine Verwendung von Dateien beschrieben wird. Mein Problem scheint an der Kodierung zu liegen da ich ja nur unleserlichen Text bekomme wenn ich die Datei normal öffne.

StreamReader Reader = new StreamReader("C:\\Programme\\World of Warcraft\\Cache\\WDB\\deDE\\itemcache.wdb");

Mir fehlt jetzt der Ansatz die Ausgabe zu kodieren damit ich die Infos auch auswerten kann. Das speichern der Informationen in Arrays usw ist kein Problem, das Einzigste Problem liegt an der Kodierung da hab ich wirklich nichts gefunden ab schon ewig bei Google gesucht.

Danke schon mal für jeden Tipp bzw Hinweis!
Andre

40 Beiträge seit 2007
vor 16 Jahren

Vielleicht hilft dire der System.Text-Namespace weiter.

http://msdn2.microsoft.com/de-de/library/system.text(vs.80).aspx

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

danke für die Antwort leider hat mich das Ganze auch nicht viel weiter gebracht 🙁
Ich habe folgendes versucht:

StreamReader Reader = new StreamReader("C:\\Programme\\World of Warcraft\\Cache\\WDB\\deDE\\itemcache.wdb");

char[] chars = Reader.ReadLine().ToCharArray();

// Encode characters using an Encoding object.
Encoding encoding = Encoding.UTF7;

// Encode complete array for comparison.
Byte[] allCharactersFromEncoding = encoding.GetBytes(chars);
char[] test = encoding.GetChars(allCharactersFromEncoding);

ShowArray(test);

Console.ReadLine();

Hier die ShowArray()-Funktion

public static void ShowArray(Array theArray)
{
    foreach (Object o in theArray)
    {
        Console.Write("{0}", o);
    }

    Console.WriteLine("\n");
}

Leider bekomme ich auch so nur Fragezeichen und irgendwelche Symbole raus habe das ganze mal als Bild an gehangen um es zu veranschaulichen.
Wie man sieht kann man zwar teilweise den Namen des Gegenstandes lesen aber der Rest ist ja unleserlich.

309 Beiträge seit 2007
vor 16 Jahren

Ich vermute einmal, das es auch nicht vorgesehen ist, einen lesbaren Text aus der Datei zu holen.

Falls es sich um die Sicherung eines Spielstand handelt, weren alle Gegenstände/Stellungen/Positionen kodiert sein.

Ein Breitschwert ist dann eben kein "Breitschwert" als String sondern der Eintrag 0x073f an der Stelle 0x1234 (Beispiel)

Da hilft nur Schrittweise Spielstände zu speichern und zu sehen, was sich jeweils ändert, um so ggf. den Code zu knacken.

ggf. kannst du ja auch Bytes/Bits ändern uns sehen, was im Spiel passiert.

Wenn du Glück hast, hat sich schon jemand anderes die Arbeit gemacht und du kannst den Aufbau der Daten ergoogeln ...

Mfg Hajoseb

**"Zufall ist das Pseudonym Gottes, wenn er nicht selbst unterschreiben will.” **
Anatole France

243 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

du musst die Datei binär lesen (mittels :rtfm: BinaryReader). Was du dann erhälst sind dann Bytes und kein fertiger Text.

Wie du die Bytes zu interpretieren hast steht ja auf dieser Seite http://wowdev.org/wiki/index.php/Itemcache.wdb .

Gruß ldr

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Danke für eure Antworten.
Habe es jetzt folgendermaßen versucht:


string path = "C:\\Programme\\World of Warcraft\\Cache\\WDB\\deDE\\itemcache.wdb";

FileInfo fi = new FileInfo(path);
FileStream fs = new FileStream(path, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
byte[] WDBData = br.ReadBytes(Convert.ToInt32(fi.Length));

Und habe versucht die Einträge so zu interpretieren


Convert.ToChar(WDBData[0]);

Wenn ich allerdings folgendes mache:


Convert.ToUInt32(WDBData[4]);

Erhalte ich immer ganz andere Zahlen als aus der Datei. Und das andere Problem ist ich bekomme ja pro Convert-Eintrag nur einen Buchstaben und Gegenstandsnamen aus dem Spiel sind ja nicht immer Gleichlang wie könnte ich herausfinden wie lang diese sind?
Und interpretiere ich überhaupt richtig? Weil ich hab keine Ahnung vom interpretieren das mit dem Convert ist mir so eingefallen.

Gruß,
Andre

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

ReadIn32 oder BitConverter

herbivore

D
386 Beiträge seit 2007
vor 16 Jahren

Ich rate eher zum C# Grundlagenbuch.
Das Format ist ja unter dem o.a. Link exakt definiert. Wenn man es dann nicht auslesen kann wuerde ich eben erst zu einem generellen Tutorial raten.
Nichts fuer ungut.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

danke für die Hilfe!
Ich habe es jetzt soweit hinbekommen bis auf ein kleines Problem.
Und zwar lese ich die Gegenstandsnamen folgendermaßen aus:


Console.Write(br.ReadChar());
Console.Write(br.ReadChar());
Console.Write(br.ReadChar());
Console.Write(br.ReadChar());
Console.Write(br.ReadChar());

Halt für jeden Buchstaben eine Zeile aber die Namen sind ja nicht alle gleich lang. Gibt es da irgendwelche Möglichkeiten zu prüfen wie lang das Wort ist oder zu prüfen ob das nächste Byte ein Char ist?

Gruß,
Andre

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Andre4tw,

dafür gibt es keine allgemeine Regel. An einem byte kann man natürlich so nicht sehen, wie es zu interpretieren ist. Es muss aber in deiner Beschreibung des Formats stehen, woran man erkennen kann, wann ein String zu Ende ist.

herbivore

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

sorry war mein Fehler hab in der Konsole nicht gesehen das hinter dem Namen ein Leerzeichen ist damit hat sich das Problem erledigt habe es jetzt so gelöst.


while (true)
{
    if (br.PeekChar() == 0)
        break;
    else
        Console.Write(br.ReadChar());
}

Console.Write(br.ReadChar());

Nochmal ein großes DANKE für eure Hilfe ich hoffe es klappt jetzt alles Weitere ohne Probleme.

Gruß,
Andre

D
386 Beiträge seit 2007
vor 16 Jahren

Schoen das es geht.
Das ist nur kein Leerzeichen (das waere eine 32dec/20hex als Wert) sondern ein NUL.
Das steht uebrigens auch genau so in der Dokumentation zu der Datei:

The strings are null-byte terminated.

Pound for pound, plutonium is about as toxic as caffeine when eaten.

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hallo,

oh da muss ich zugeben den Satz hab ich ganz übersehen X(

Notiz an mich: Nächstes mal besser lesen 😁

363 Beiträge seit 2007
vor 16 Jahren

Was ich dir noch empfehlen kann. Such dir doch den von Telo das Addon Lootlink raus.
Im Quellcode müßte ja enthalten sein wie die Struktur der itemcache.wdb ist.
Ansonsten wäre es interessant wozu du das machst, da es ja eigentlich genug Schnittstellen zur WoWApi gibt und LUA da der einfachere Weg ist.

Gruß Cookiie

"Hail to the King, Baby!"

D
386 Beiträge seit 2007
vor 16 Jahren

Original von Cookiie
Im Quellcode müßte ja enthalten sein wie die Struktur der itemcache.wdb ist.

Aehm.. Und was ist mit dem Link auf die detaillierte Beschreibung des Formats, der zweimal oder mehr hier im Thread gepostet wurde? Da steht eigentlich alles nuetzliche drin..

Pound for pound, plutonium is about as toxic as caffeine when eaten.

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Original von Cookiie
Was ich dir noch empfehlen kann. Such dir doch den von Telo das Addon Lootlink raus.
Im Quellcode müßte ja enthalten sein wie die Struktur der itemcache.wdb ist.
Ansonsten wäre es interessant wozu du das machst, da es ja eigentlich genug Schnittstellen zur WoWApi gibt und LUA da der einfachere Weg ist.

Gruß Cookiie

Hi,

ja mit Lua lassen sich aber nicht so detaillierte Informationen über Gegenstände rausholen wie aus dieser Datei.
Ich programmier im Moment für meine Gilde eine Profiler Seite auf der die Charakter Informationen sichtbar sind. Und über Lua hol ich mir nur die Charakterdaten da es da keine Möglichkeit gibt so viele Informationen über Gegenstände einzuholen 😉

Gruß,
Andre

363 Beiträge seit 2007
vor 16 Jahren

Hi,

also unser Gildenmeister hat die Gilden-HP jetzt auch erneuert und nutzt für die Charakterdarstellung die Daten die das Arsenal von Blizz bietet. Dazu speichert er die Daten lokal und aktuallisiert sie täglich. So sieht das beispielsweise im Arsenal aus, falls du dir das noch nicht angesehen hast.
Wenn du natürlich detailiertere Daten willst, musste dir das wohl wirklich selber schreiben. Ist jetzt halt so ne Sache, muss ich wirklich wissen wieviele Verbände der Char in seinen Taschen hat usw. Aber das ist ne Sache die du entscheiden musst.

Gruß Curatio

"Hail to the King, Baby!"

A
Andre4tw Themenstarter:in
20 Beiträge seit 2007
vor 16 Jahren

Hi,

das Arsenal kenne ich aber ich hab ja schon einen Upload-Client geschrieben, nur hatten wir bisher keine Item Daten auf unserer Seite nur die grundlegenden Charakter Daten wie Stufe, Volk usw.
Wir wollen uns halt jetzt was ausweiten 😉
Und für mich ist es einfach etwas Übung werde vielleicht auch noch Quest- und NPC-Daten speichern und ne richtige Datenbank machen. Ist ja alles Übung 😉

Gruß,
Andre

363 Beiträge seit 2007
vor 16 Jahren

Dem gibt es nichts hinzuzufügen 🙂.
Wollte dir ja auch nur Hilfe geben, falls du dir nicht unnötig Arbeit machen willst.

Hogger down!!!111Elf

Cookiie

"Hail to the King, Baby!"