2013-06-27 10 views
7

Ich sende komprimierte Daten von einer Java-App über nodejs an eine Webseite. Die Daten werden mit dem Java Deflater- und Base64-Encoding komprimiert. Auf der Webseite versuche ich, die Daten mit https://github.com/dankogai/js-deflate aufzublasen, aber es funktioniert nicht (leeres Ergebnis). Fehle ich etwas?Deflate in Java - In Javascript aufblasen

Java Seite:

private String compress(String s) { 
    DeflaterOutputStream def = null; 
    String compressed = null; 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     // create deflater without header 
     def = new DeflaterOutputStream(out, new Deflater(Deflater.DEFAULT_COMPRESSION, true)); 
     def.write(s.getBytes()); 
     def.close(); 
     compressed = Base64.encodeBase64String(out.toByteArray()); 
     System.out.println(compressed); 
    } catch(Exception e) { 
     Log.c(TAG, "could not compress data: " + e); 
    } 
    return compressed; 
} 

Javascript Seite:

var data = RawDeflate.inflate(Base64.fromBase64(compressed)); 

Antwort

1

Try this:

public static String compressAndEncodeString(String str) { 
    DeflaterOutputStream def = null; 
    String compressed = null; 
    try { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     // create deflater without header 
     def = new DeflaterOutputStream(out, new Deflater(Deflater.BEST_COMPRESSION, true)); 
     def.write(str.getBytes()); 
     def.close(); 
     compressed = Base64.encodeToString(out.toByteArray(), Base64.DEFAULT); 
    } catch(Exception e) { 
     Log.e(TAG, "could not compress data: " + e); 
    } 
    return compressed; 
} 
+0

Funktioniert gut in Kombination mit JSInfllate – ndsc

0

Ich lief in das gleiche Problem. Das js-deflate Projekt Inflater scheint gebrochen. Ich fand, dass es bei einer kurzen Eingabe funktioniert, aber bei einer langen Eingabe fehlschlägt (z. B. lorem ipsum als Testdaten).

Eine bessere Option stellte sich zlib.js heraus.

Hier ist, wie ich es bin mit in Javascript ein JSON-Objekt aufzublasen, der erzeugt wird, komprimiert und base64 auf dem Server verschlüsselt:

var base64toBinary = function (base64) { 
    var binary_string = window.atob(base64); 
    var len = binary_string.length; 
    var bytes = new Uint8Array(len); 
    for (var i = 0; i < len; i++)  { 
     var ascii = binary_string.charCodeAt(i); 
     bytes[i] = ascii; 
    } 
    return bytes.buffer; 
} 

var utf8ToString = function (uintArray) { 
    var encodedString = String.fromCharCode.apply(null, uintArray), 
     decodedString = decodeURIComponent(escape(encodedString)); 
    return decodedString; 
} 

var object = JSON.parse(utf8ToString(
    new Zlib.RawInflate(base64toBinary(base64StringFromServer)).decompress())); 

(FYI, werden die Hilfsfunktionen, die von anderen Stackoverflow Antworten).