Laden...

Bytestrom durchsuchen

Erstellt von Tanner vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.194 Views
T
Tanner Themenstarter:in
19 Beiträge seit 2007
vor 17 Jahren
Bytestrom durchsuchen

Hallo,

hab da ein Problem.
Ich habe eine binäre Datei, die Daten enthält die ich auslesen möchte. Am Anfang der Datei steht irgendein unwichtiger Müll.
Interessant wird es erst, wenn ich in der Datei 0xFFFFFFFF 0xFFFFFF00 finde. Ab da kommen dann die für mich wichtigen Daten.
Wie aber finde ich den Punkt, ab dem meine Daten interessant sind?
Gehe ich Recht in der Annahme, dass 0xFFFFFFF ein UInt32 ist?
Versuche das jetzt so einzulesen:


FileStream fStream;
            fStream = new FileStream(file, FileMode.Open);
            BinaryReader readFile = new BinaryReader(fStream);

            try
            {
                for (int i = 0; i < 10000000; i++)//einfach mal nen Wert gesetzt
                {
                    UInt32 test = readFile.ReadUInt32();
                    if (test == 0xFFFFFFFF)
                    {
                        test = readFile.ReadUInt32();
                        if (test == 0xFFFFFF00)
                        {
                            MessageBox.Show("juhu");
                        }
                    }
                }
                MessageBox.Show("Nix passiert");
            }
            catch (EndOfStreamException e)
            {
                MessageBox.Show("File loaded");
            }

Müsste doch eigentlich so gehen, oder?
Allerdings finde ich dieses Vorkommen so nie... Immer nur 0xFFFFFFFF alleine. Aber vielleicht gehe ich die Sache ja auch falsch an. Wäre für Hilfe dankbar...

Tanner

6.862 Beiträge seit 2003
vor 17 Jahren

Bei deinem jetzigen Code gehst du ja davon aus dass der Wert wirklich an einer 32 Bit Grenze vorkommt, also cafecafe cafecafe ffffffff ffffff00 ...

Was aber wenn da jetzt sowas steht?

cafecafe cafeffff ffffffff ff00... dann findest du deine Daten nach aktuellen Code nicht, den Fall musst du berücksichtigen.

Am einfachsten ist, du schaust wirklich bitweise, wenn ne 1 kommt schaust nach ob danach wieder ne 1 kommt usw. wenn 56 Einsen kamen und dann 8 Nullen, weist du dass du deine Stelle gefunden hast.

Baka wa shinanakya naoranai.

Mein XING Profil.

G
58 Beiträge seit 2007
vor 17 Jahren

Weiterhin:

while(readFile.PeekChar() != -1) {
//Zeuch
}

spart dir die hässliche EndOfStreamException

B
1.529 Beiträge seit 2006
vor 17 Jahren

du schaust wirklich bitweise

Vermutlich wird byteweise reichen...

6.862 Beiträge seit 2003
vor 17 Jahren

Nee, Byteweise reicht nicht, weil du damit keine Fälle wie afffffff fffffff0 0... abfangen kannst, weil die Grenze auf nem Halbbyte liegt. Mein erster Vorschlag bitweise zu schaun ist aber auch falsch, weil damit auch Muster wie 1 ffffffff fffffe01 zutreffen würden welche aber net dem Muster entsprechen. Du musst es sogar dann Halbbyte weise vergleichen.

Baka wa shinanakya naoranai.

Mein XING Profil.

B
1.529 Beiträge seit 2006
vor 17 Jahren

Ich möchte halb widersprechen.

Mir klang der erste Post nicht so, als ob eine Bitfolge gesucht würde. Wenn das der Fall sein sollte, hast du, talla, natürlich Recht.
Allerdings werden bei den meisten binären Dateien Werte wirklich byteweise geschrieben, so dass man auch nur byteweise suchen braucht. Dadurch würde der Code deutlich einfacher. Allerdings wird der bremsende Faktor eh die Festplatte sein, so dass es aus Performancegesichtspunkten keinen Unterschied macht.

Ein bitweises Suchen ergibt meist nur bei Bitstreams Sinn, wie zum Beispiel alle MPEG-Dialekte oder andere Audio- und Videoformate.