Deflate Decodierungs Problem

Iam_Fiction

Mitglied
Hi,
mir stellt sich folgendes Problem:
Ich habe eine Datei, deren Header mit Zlib Deflate komprimiert ist. Diesen Header möchte ich expandieren um wieder mit ihm arbeiten zu können. Also habe ich versucht ihn mit dem Inflater aus der Api zu entpacken, was mir der Inflater aber mit einer DataFormatException verweigert. Woran kann das liegen? Es handelt sich auf jedenfall um eine Deflate Kompression. Sind irg Probleme der Implementierung von Deflate in Java bekannt? habt ihr Ideen die mir weiterhelfen könnten?
Vielen Dank für eure Antworten :D
 
Naja ich hab ne Datei, aus der hole ich mir den komprimierten Header
Code:
byte[] c_header = new byte[header_length - 8];
mgx_input.read(c_header);

Diesen komprimierten Teil will ich dann wieder expandieren um damit weiterarbeiten zu können. Und da liegt mein Problem.

Code:
Inflater decompresser = new Inflater();
decompresser.setInput(c_header, 0, c_header.length);
byte[] result = new byte[?]; // das byte array für die originaldaten
int resultLength = decompresser.inflate(result);
decompresser.end();

Hierbei tritt eine DataFormatException auf. Die Daten sind aber sicher mit der Deflate Methode komprimiert :(
 
Hallo,

wie gesagt kann dir schneller helfen, wenn du ein kleines Beispiel File anhängst mit dem ich herumspielen kann...
Dann bräuchte ich noch die Information wie lang (bytes) der Header ist.

Gruß Tom
 
Hier also die Datei (im Zip Archiv). Der Header ist 87636 Bytes lang (Deflate komprimiert). Beginn des Headers bei 8 Byte (2 Integer à 4 byte davor). Byte Order ist Little-Endian. Der Rest der Datei ist irrelevant. Danke für deine Hilfe :)
 

Anhänge

Hallo,

Willst du wirklich nur den Header oder möchtest du das ganze einfach entpacken?
Welche Informationen brauchst du aus dem Header?
Wie soll der Inflated Header denn ausschauen?

Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

/**
 * @author Thomas.Darimont
 * 
 */
public class DeflateExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        File file = new File(
                "C:/Dokumente und Einstellungen/Thomas.Darimont/Desktop/test.zip");

        ZipFile zipFile = new ZipFile(file);

        File baseDirectory = new File("c:/tmp");

        Enumeration<? extends ZipEntry> zipEntries = zipFile.entries();
        while (zipEntries.hasMoreElements()) {
            ZipEntry zipEntry = zipEntries.nextElement();
            System.out.println(zipEntry.getName());

            outputContentsTo(zipFile.getInputStream(zipEntry), new File(
                    baseDirectory, zipEntry.getName()));

        }
        zipFile.close();
    }

    private static void outputContentsTo(InputStream inputStream, File file)
            throws Exception {
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        byte[] buffer = new byte[8192];
        for (int bytesRead = inputStream.read(buffer); bytesRead > 0; bytesRead = inputStream
                .read(buffer)) {
            fileOutputStream.write(buffer, 0, bytesRead);
        }
        fileOutputStream.close();
    }

}

Winzip gibt mir zud em File folgende Informationen:
Code:
Teste ...
Aktuelle Position Teil 1 offset 152800
Archiv: C:\Dokumente und Einstellungen\Thomas.Darimont\Desktop\test.zip   152822 Byte   1 Datei
End-of-Central-Directory-Eintrag PK0506 (4+18)
==========================================
    Aktuelle Pos. des End-of-Central-Directory:         152800 (0x000254e0) Byte
    Erwartete Pos. des End-of-Central-Directory:        152800 (0x000254e0) Byte
      basierend auf der Größe des Zentralverzeichnisses
      von 54 und relativer Offset von 152746 Byte
    Teilnummer dieses Teils (00):                       Teil 1
    Teilnummer des Start-of-Central-Directory (00):     Teil 1
    Anzahl der Einträge im Zentralverz. dieses Teils:   1
    Anzahl der Einträge im Zentralverz. insgesamt:      1
    Größe des Zentralverzeichnisses:                    54 (0x00000036) Byte
    Relativer Offset des Zentralverzeichnisses:         152746 (0x000254aa) Byte
    Länge des Archivkommentars:                         0
Aktuelle Position Teil 1 offset 152746
Central-Directory-Eintrag PK0102 (4+42): #1
=====================================
    Teilnummer Dateibeginn (00):                        Teil 1
    Relativer Offset des lokalen Headers:               0 (0x00000000) Byte
    Versionsangabe des Betriebssystems (00):            MS-DOS, OS/2, NT FAT
    Versionsangabe des Packprogramms (20):              2.0
    Erforderl. Betriebssystem für Extrahieren (00):     MS-DOS, OS/2, NT FAT
    Erforderl. Packprogrammvers. für Extrahieren (20):  2.0
    Allgemeines Bitflag (0x0000) (Bit 15..0):           0000.0000 0000.0000
      Dateisicherheitsstatus  (Bit 0):                  not encrypted
      Erweiterter lokaler Header (Bit 3):               no
    Komprimierungsmethode (08):                         deflated
      Komprimierungsuntertyp (Deflation):               normal
    Datum letzten Änderung (0x0000367d 0x0000a247):     2007-Mrz-29 20:18:14
    32-Bit-CRC-Wert:                                    0xc9afbc98
    Komprimierte Größe:                                 152708 Byte
    Unkomprimierte Größe:                               1199983 Byte
    Länge des Dateinamens:                              8 Zeichen
    Länge des zusätzlichen Felds:                       0 Byte
    Länge des Dateikommentars:                          0 Zeichen
    Interne Dateiattribute:                             0x0000
      Anscheinender Dateityp:                           binary
    Externe Dateiattribute:                             0x00000020
      Externe Nicht-MS-DOS-Dateiattribute:              0x000000
      MS-DOS-Dateiattribute (0x20):                     arc
Aktuelle Position Teil 1 offset 152792
    Dateiname:test.mgx
Aktuelle Position Teil 1 offset 0
Lokalverzeichniseintrag PK0304 (4+26): #1
-----------------------------------
    Erforderl. Betriebssystem für Extrahieren (00):     MS-DOS, OS/2, NT FAT
    Erforderl. Packprogrammvers. für Extrahieren (20):  2.0
    Allgemeines Bitflag (0x0000) (Bit 15..0):           0000.0000 0000.0000
      Dateisicherheitsstatus  (Bit 0):                  not encrypted
      Erweiterter lokaler Header (Bit 3):               no
    Komprimierungsmethode (08):                         deflated
      Komprimierungsuntertyp (Deflation):               normal
    Datum letzten Änderung (0x0000367d 0x0000a247):     2007-Mrz-29 20:18:14
    32-Bit-CRC-Wert:                                    0xc9afbc98
    Komprimierte Größe:                                 152708 Byte
    Unkomprimierte Größe:                               1199983 Byte
    Länge des Dateinamens:                              8 Zeichen
    Länge des zusätzlichen Felds:                       0 Byte
Aktuelle Position Teil 1 offset 30
    Dateiname:test.mgx
Aktuelle Position Teil 1 offset 38
    Teste: test.mgx                 OK
Keine Fehler in den komprimierten Dateien von C:\Dokumente und Einstellungen\Thomas.Darimont\Desktop\test.zip gefunden.

Bist du sicher das der Header auch mitgepackt ist?
Wenn ich versuche den Header via:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.zip.InflaterInputStream;

/**
 * @author Thomas.Darimont
 * 
 */
public class DeflateExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		File file = new File(
				"C:/Dokumente und Einstellungen/Thomas.Darimont/Desktop/test.zip");

		InputStream inputStream = new FileInputStream(file);
		inputStream.skip(8);

		byte[] deflateCompressedHeader = new byte[87636];
		inputStream.read(deflateCompressedHeader);

		InputStream inflaterInputStream = new InflaterInputStream(
				new ByteArrayInputStream(deflateCompressedHeader));

		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

		byte[] buffer = new byte[8192];
		for (int bytesRead = inflaterInputStream.read(buffer); bytesRead >= 0; bytesRead = inflaterInputStream
				.read(buffer)) {
			outputStream.write(buffer, 0, bytesRead);
		}

		byte[] inflatedHeader = outputStream.toByteArray();
		System.out.println(inflatedHeader.length);
	}
}
zu entpacken bekomme ich:
Code:
Exception in thread "main" java.util.zip.ZipException: incorrect header check
	at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
	at java.io.FilterInputStream.read(FilterInputStream.java:90)
	at de.tutorials.DeflateExample.main(DeflateExample.java:38)

Kenne mich mit dem Deflate Format nicht aus...

Gruß Tom
 
Um hast mich falsch verstanden ^^ Es handelt sich um die File in dem Zip-Archiv. In dieser File ist der entsprechende Header komprimiert. Ist keine Zip Datei sondern eine ganz normale Binary Datei. Ein Teil dieser Datei ist eben komprimiert und muss für die Bearbeitung erst expandiert werden nur irg mag das nicht so...

edit: musste die File nur in eine Zip packen weil sie für den Upload zu gross war.
 
Hallo,

na dann sag das doch gleich ;-)

versuchs mal hiermit:
Java:
/**
 * 
 */
package de.tutorials;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;

/**
 * @author Thomas.Darimont
 * 
 */
public class DeflateExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        File file = new File("C:/tmp/test.mgx");
        InputStream inputStream = new FileInputStream(file);
        outputHeaderTo(inputStream, new File(file.getParentFile(), "Header_"
                + file.getName()));
        inputStream.close();
    }

    private static void outputHeaderTo(InputStream inputStream, File file)
            throws Exception {
        inputStream.skip(8);
        byte[] compressedHeaderContent = new byte[87636];
        inputStream.read(compressedHeaderContent);

        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
                compressedHeaderContent);
        InputStream inflaterInputStream = new InflaterInputStream(
                byteArrayInputStream, new Inflater(true));
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

        byte[] buffer = new byte[8192];
        for(int bytesRead = inflaterInputStream.read(buffer); bytesRead > 0 ; bytesRead = inflaterInputStream.read(buffer)){
            byteArrayOutputStream.write(buffer,0,bytesRead);
        }

        FileOutputStream fileOutputStream = new FileOutputStream(file);
        fileOutputStream.write(byteArrayOutputStream.toByteArray(), 0,
                byteArrayOutputStream.size());
        fileOutputStream.close();
    }
}

Hab den Beispiel Header für test.mgx angehängt.

Gruß Tom
 

Anhänge

Zurück