Frage

Mit dem folgenden Java-Code zum Komprimieren / Dekomprimieren Bytes [] zu / von GZIP. Erstes Textbytes zu gzip Bytes:

public static byte[] fromByteToGByte(byte[] bytes) {
    ByteArrayOutputStream baos = null;
    try {
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        baos = new ByteArrayOutputStream();
        GZIPOutputStream gzos = new GZIPOutputStream(baos);
        byte[] buffer = new byte[1024];
        int len;
        while((len = bais.read(buffer)) >= 0) {
            gzos.write(buffer, 0, len);
        }
        gzos.close();
        baos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return(baos.toByteArray());
}

Dann wird das Verfahren, das die andere Art und Weise komprimiert Bytes unkomprimierte Bytes geht:

public static byte[] fromGByteToByte(byte[] gbytes) {
    ByteArrayOutputStream baos = null;
    ByteArrayInputStream bais = new ByteArrayInputStream(gbytes);
    try {
        baos = new ByteArrayOutputStream();
        GZIPInputStream gzis = new GZIPInputStream(bais);
        byte[] bytes = new byte[1024];
        int len;
        while((len = gzis.read(bytes)) > 0) {
            baos.write(bytes, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return(baos.toByteArray());
}

Denken Sie es irgendeine Wirkung, da ich schreibe aus nicht auf eine gzip-Datei?
Ich habe auch bemerkt, dass in der Standard-C # Funktion, dass BitConverter die ersten vier Bytes liest und dann die Memory Write-Funktion wird mit einem Startpunkt von 4 und einer Länge von Eingangspufferlänge genannt - 4. So ist die Wirkung auf die Gültigkeit der Header?

Jim

War es hilfreich?

Lösung

Ich habe versucht es aus, und ich kann nicht Ihre ‚Ungültige GZIP Header‘ Problem reproduzieren. Hier ist, was ich getan habe:

Java Seite

habe ich Ihre Java-Komprimierungsmethode zusammen mit diesem Java-Snippet:

public static String ToHexString(byte[] bytes){
    StringBuilder hexString = new StringBuilder();
        for (int i = 0; i < bytes.length; i++)
            hexString.append((i == 0 ? "" : "-") + 
                Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
    return hexString.toString();
}

Damit diese minimalistische Java-Anwendung, das Bytes einer Test Zeichenfolge nehmen, Komprimieren, und es zu einem Hex-String der komprimierten Daten konvertieren ...:

public static void main(String[] args){
    System.out.println(ToHexString(fromByteToGByte("asdf".getBytes())));
}

... gibt die folgenden (I hinzugefügt Anmerkungen) :

1f-8b-08-00-00-00-00-00-00-00-4b-2c-4e-49-03-00-bd-f3-29-51-04-00-00-00
^------- GZip Header -------^ ^----------- Compressed data -----------^

C # Seite

Ich schrieb zwei Methoden zum Komprimieren und Dekomprimieren ein Byte-Array zu einem anderen Byte-Array (Komprimierungsmethode ist nur der Vollständigkeit halber, und meine testings) :

public static byte[] Compress(byte[] uncompressed)
{
    using (MemoryStream ms = new MemoryStream())
    using (GZipStream gzs = new GZipStream(ms, CompressionMode.Compress))
    {
        gzs.Write(uncompressed, 0, uncompressed.Length);
        gzs.Close();
        return ms.ToArray();
    }
}

public static byte[] Decompress(byte[] compressed)
{
    byte[] buffer = new byte[4096];
    using (MemoryStream ms = new MemoryStream(compressed))
    using (GZipStream gzs = new GZipStream(ms, CompressionMode.Decompress))
    using (MemoryStream uncompressed = new MemoryStream())
    {
        for (int r = -1; r != 0; r = gzs.Read(buffer, 0, buffer.Length))
            if (r > 0) uncompressed.Write(buffer, 0, r);
        return uncompressed.ToArray();
    }
}

Zusammen mit einer kleinen Funktion, die einen Hex-String, und wieder in einer Byte-Array nimmt ... (auch nur für Testzwecke) :

public static byte[] ToByteArray(string hexString)
{
    hexString = hexString.Replace("-", "");
    int NumberChars = hexString.Length;
    byte[] bytes = new byte[NumberChars / 2];
    for (int i = 0; i < NumberChars; i += 2)
        bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
    return bytes;
}

... Ich habe folgende:

// Just hardcoded the output of the java program, convert it back to byte[]
byte[] fromjava = ToByteArray("1f-8b-08-00-00-00-00-00-00-00-" + 
                  "4b-2c-4e-49-03-00-bd-f3-29-51-04-00-00-00");

// Decompress it with my function above
byte[] uncompr = Decompress(fromjava);

// Get the string out of the byte[] and print it
Console.WriteLine(System.Text.ASCIIEncoding.ASCII
                    .GetString(uncompr, 0, uncompr.Length));

Et voila, der Ausgang ist:

asdf

Funktioniert perfekt für mich. Vielleicht sollten Sie Ihre Dekompression Methode in c # Anwendung überprüfen.

Sie sagten in Ihrer vorherigen Frage, die Sie diesen Byte-Arrays in einer Datenbank speichern, nicht wahr? Vielleicht möchten Sie aus der Datenbank wieder so, wie Sie sie in setzen, ob der Bytes überprüfen.

Andere Tipps

Posting dies als eine Antwort so sieht der Code in Ordnung. Beachten Sie ein paar Dinge:
Zunächst wird die Hin- und Rückfahrt in die Datenbank haben scheinen keine Wirkung zu haben. Java auf beiden Seiten erzeugte genau das, was ich setzte in. Java in C # heraus haben gut funktioniert mit dem Ionic-API, wie auch C # in und Java aus. Was mich zum zweiten Punkt bringt. Zweitens war meine ursprüngliche decompress in der Größenordnung von:

public static string Decompress(byte[] gzBuffer)
{
    using (MemoryStream ms = new MemoryStream())
    {
        int msgLength = BitConverter.ToInt32(gzBuffer, 0);
        ms.Write(gzBuffer, 4, gzBuffer.Length – 4);
        byte[] buffer = new byte[msgLength];
        ms.Position = 0;
        using (GZipStream zip = new GZipStream(ms, CompressionMode.Decompress))
        {
            zip.Read(buffer, 0, buffer.Length);
        }
        return Encoding.UTF8.GetString(buffer);
    } 
}  

, die auf der internen Byte-Zählung abhing, lesen Sie die gesamte Datei, unabhängig von internem Wert. Sie wissen nicht, was der Ionic-Algorithmus ist. Mit freundlichen funktioniert genauso wie die Java-Methoden, die ich verwendet habe. Das ist der einzige Unterschied, den ich sehe. Vielen Dank für all die Arbeit zu tun. Ich werde nicht vergessen, dass Art und Weise tun. Vielen Dank, Jim

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top