Einzelnen Beitrag anzeigen

MatthiasR

Registriert seit: 21. Apr 2005
193 Beiträge
 
#16

AW: XE2: gzip-Datei mittels System.ZLib dekomprimieren

  Alt 2. Jan 2012, 10:06
Das mit den Headern muss ich mal ausprobieren, einen ähnlichen verdacht hatte ich auch schon, aber einfach nur die ersten 10 Bytes (gzip-Header) abzutrennen brachte erstmal nichts.
Äh Moment. Du willst diese Methode verwenden um ein Zip-Archiv zu entpacken. Wird nicht gehen. Die oben verwendete Funktion kann nur Streams (de)komprimieren. Bei einem GZip-Archiv gibt es noch Verwaltungsinformationen "Drum herum" um die einzelnen Datei im Archiv verwalten zu können.
Ich glaube, ich muss das nochmal etwas präzisieren...

Gegeben ist ein Byte-Array, von dem ich lediglich weiß, dass es "gzip-komprimiert" ist. Genauer kann ich es leider nicht sagen. Dieses Byte-Array schaut wie folgt aus:
Delphi-Quellcode:
RawData: array[0..447] of Byte = (
    $1F, $8B, $08, $00, $00, $00, $00, $00, $00, $00, $8D, $52, $DB, $4E, $E3,
    $30, $10, $FD, $95, $C8, $EF, $8D, $93, $55, $5B, $DA, $AA, $31, $5A, $E8,
    $0A, $2A, $01, $41, $ED, $72, $79, $AB, $4C, $32, $90, $08, $C7, $46, $1E,
    $A7, $40, $BF, $97, $D7, $FD, $87, $9D, $12, $27, $DB, $AA, $AC, $C4, $4B,
    $26, $3E, $97, $99, $63, $6B, $A6, $C7, $6F, $95, $0A, $D6, $60, $B1, $34,
    $3A, $61, $71, $18, $B1, $00, $74, $66, $F2, $52, $3F, $25, $6C, $BE, $4C,
    $7B, $A3, $D1, $60, $DC, $8B, $07, $2C, $40, $27, $75, $2E, $95, $D1, $90,
    $B0, $77, $40, $76, $2C, $A6, $6B, $CC, $5F, $26, $37, $A7, $AB, $6B, $F2,
    $1B, $D0, $AA, $CC, $0A, $B8, $DD, $F6, $A2, $6A, $1D, $90, $9C, $3E, $F7,
    $97, $17, $01, $0D, $D1, $38, $D9, $CA, $13, $56, $38, $F7, $32, $E1, $FC,
    $15, $C3, $27, $A8, $A4, $2B, $9F, $C3, $1C, $F8, $A3, $E4, $C4, $22, $FF,
    $46, $33, $BE, $1E, $84, $31, $0B, $4E, $67, $97, $AB, $DB, $5F, $8B, $E5,
    $3C, $BD, $4A, $18, $21, $94, $DC, $07, $DA, $31, $D9, $43, $48, $AF, $E6,
    $33, $71, $1F, $C7, $51, $74, $74, $34, $1C, $F6, $A7, $FC, $4B, $41, $63,
    $FB, $8C, $A2, $FD, $E1, $0C, $1E, $6A, $EB, $90, $62, $D4, $95, $88, $C7,
    $C3, $7E, $D4, $FF, $31, $F2, $F6, $3D, $CE, $8F, $34, $56, $CB, $0A, $C4,
    $8D, $B2, $65, $26, $DB, $31, $1E, $6C, $24, $57, $32, $2B, $3E, $8F, $A9,
    $FB, $83, $E8, $3E, $1C, $0D, $EF, $9D, $58, $28, $A9, $3E, $10, $E7, $4D,
    $9D, $AC, $CD, $81, $59, $A1, $20, $2B, $9C, $B8, $EB, $C6, $77, $50, $37,
    $1C, $A5, $DB, $BC, $1A, $EB, $C4, $3A, $AC, $C3, $4D, $F8, $2F, $40, $47,
    $B4, $21, $2A, $D0, $B8, $A9, $B7, $B0, $38, $91, $D6, $E8, $52, $77, $83,
    $77, $A8, $46, $FD, $9B, $B2, $29, $71, $6D, $CD, $63, $18, $CC, $6C, $DB,
    $B5, $41, $1B, $C5, $D2, $59, $89, $08, $FA, $67, $6E, $81, $6A, $FB, $92,
    $06, $9D, $A2, $8B, $6D, $64, $A1, $44, $3C, $8A, $06, $63, $6F, $DD, $23,
    $1A, $6D, $4A, $D9, $16, $04, $9B, $EC, $D9, $8B, $D2, $2E, $ED, $05, $ED,
    $A0, $FF, $BD, $33, $85, $46, $32, $2A, $49, $BB, $01, $96, $76, $16, $C4,
    $CC, $1B, $BE, $E2, $3C, $B5, $D3, $C1, $47, $15, $0B, $D0, $F4, $DE, $F4,
    $C6, $4A, $01, $04, $B1, $17, $B6, $6C, $A3, $3D, $97, $35, $EA, $BA, $AA,
    $B6, $2B, $C5, $FF, $83, $1C, $5C, $9D, $EF, $6D, $D1, $C1, $A6, $75, $C6,
    $6F, $6C, $BD, $F8, $0B, $55, $D5, $C0, $47, $AA, $03, $00, $00
  );
Dieses Byte-Array hab ich mir mittels MemoryStream in einer "*.gz"-Datei gespeichert. Diese Datei kann ich mittels 7zip direkt dekomprimieren, sie wurde jedoch NICHT durch 7zip oder ein anderen gzip-fähiges Archivprogramm erzeugt. Es ist lediglich ein Speicherabbild des besagten Byte-Arrays. Daher kann ich auch nicht wirklich sagen, wieviele Byte nun zum Header gehören und ab wo die Rohdaten anfangen. Laut gzip-Spezifikation müssten es aber die ersten 10 Bytes sein:
Code:
Each member has the following structure:

+---+---+---+---+---+---+---+---+---+---+
|ID1|ID2|CM |FLG|     MTIME    |XFL|OS | (more-->)
+---+---+---+---+---+---+---+---+---+---+
Die ersten zwei Bytes ($1F, $8B) sind die gzip Magic Number.
Das dritte Byte ($08) signalisiert, dass deflate-Komprimierung verwendet wurde.
Darauf folgen 7 Null-Bytes ($00) und danach geht es mit den eigentlichen Rohdaten los.

@Satty67: Ich habe deine Routine zum Bearbeiten des InStreams mal ausprobiert, aber das brachte zumindest bei MEINEN Rohdaten nichts. Nach wie vor data error.

Ich habe nun jedoch entdeckt, dass die ZLibEx von http://www.base2ti.com eine spezielle "ZLibExGZ"-Unit beinhaltet, deren GZDecompressStream-Prozedur astrein funktioniert. Das Postfix "GZ" deutet ja schon darauf hin, dass die speziell auf gzip angepasst wurde. Muss mal schauen, was die intern anders machen, aber ich denke, auf die werde ich dann zurückgreifen.
  Mit Zitat antworten Zitat