Wie finde ich die Position des Central Directory in einer Zip-Datei?

8

Ich versuche, die Position des ersten Headers der zentralen Verzeichnisdatei in einer Zip-Datei zu finden.

Ich lese diese: Ссылка ) Ссылка

Wie ich es sehe, kann ich nur durch die Zip-Daten scannen, anhand der Kopfzeile erkennen, um welche Art von Abschnitt es sich handelt, und dann das tun, bis ich auf den Kopf des zentralen Verzeichnisses stoße. Ich würde natürlich die Dateiköpfe vorher lesen und die "komprimierte Größe" verwenden, um die tatsächlichen Daten zu überspringen, und nicht durch jedes Byte in der Datei for-loop ...

Wenn ich es so mache, dann kenne ich praktisch schon alle Dateien und Ordner in der Zip-Datei. In diesem Fall sehe ich nicht mehr viel für das Central Directory.

Nach meinem Verständnis besteht der Zweck des Central Directory darin, Dateimetadaten und die Position der eigentlichen Daten in der Zip-Datei aufzulisten, so dass Sie nicht die gesamte Datei durchsuchen müssen.

Nach dem Lesen des End Of Central Directory-Eintrags sagt Wikipedia:

  

Diese Reihenfolge erlaubt es, eine Zip-Datei in einem Durchgang zu erstellen, aber das ist es   in der Regel dekomprimiert durch das erste Lesen des zentralen Verzeichnisses an der   Ende.

Wie würde ich das Ende des zentralen Verzeichnisses leicht finden? Wir müssen uns daran erinnern, dass es dort einen Kommentar beliebiger Größe haben kann, so dass ich möglicherweise nicht weiß, wie viele Bytes vom Ende des Datenstroms, an dem es sich befindet, sind. Scanne ich es einfach?

P.S. Ich schreibe einen Zip-Datei-Reader.

    
Tower 21.12.2011, 17:33
quelle

3 Antworten

1

Ich habe die Bytes vom Ende an durchlaufen. Die Schleife stoppt, wenn sie eine übereinstimmende Bytefolge findet, der Index unter Null liegt oder wenn sie bereits 64k Byte durchlaufen hat.

    
Tower 22.12.2011, 18:23
quelle
8

Beginnen Sie am Ende und scannen Sie zum Anfang, suchen Sie nach dem Ende der Verzeichnissignatur und zählen Sie die Anzahl der gescannten Bytes. Wenn Sie einen Kandidaten gefunden haben, ermitteln Sie den Byte-20-Offset für die Kommentarlänge (L). Überprüfen Sie, ob L + 20 mit Ihrer aktuellen Anzahl übereinstimmt. Überprüfen Sie dann, ob der Anfang des zentralen Verzeichnisses (auf das Byte 12 Offset zeigt) eine entsprechende Signatur hat.

Wenn Sie angenommen haben, dass die Bits ziemlich zufällig waren, wenn die Signaturprüfung zufällig war (z. B. eine Schätzung in ein Datensegment), ist die Wahrscheinlichkeit, dass alle Signaturbits korrekt sind, ziemlich niedrig. Sie könnten dies verfeinern und die Chance, in einem Datensegment zu landen, und die Wahrscheinlichkeit, einen legitimen Header zu treffen (als eine Funktion der Anzahl solcher Header), herausfinden, aber dies klingt für mich bereits nach einer niedrigen Wahrscheinlichkeit. Sie können Ihr Konfidenzniveau erhöhen, indem Sie die Signatur des ersten aufgelisteten Dateieintrags überprüfen. Achten Sie jedoch darauf, den Grenzfall einer leeren ZIP-Datei zu berücksichtigen.

    
Derek E 09.01.2013 15:53
quelle
1

Einfach Daumen drücken und hoffen, dass es keinen Eintrag mit dem CRC, Zeitstempel oder Datumsstempel wie 06054B50 oder irgendeine andere Folge von vier Bytes gibt, die 06054B50 sind.

    
user2624417 11.01.2014 17:57
quelle

Tags und Links