Deflate в Java - Inflate в Javascript

Я отправляю сжатые данные из java-приложения через nodejs на веб-страницу. Данные сжаты с помощью дефлятора java и закодированы в base64. На веб-странице я пытаюсь раздуть данные с помощью https://github.com/dankogai/js-deflate, но это не работает (пустой результат). Я что-то упускаю?

Сторона Java:

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:

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

person dbrettschneider    schedule 27.06.2013    source источник


Ответы (2)


Попробуй это:

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;
}
person ejavice    schedule 03.07.2013
comment
Прекрасно работает в сочетании с JSInflate - person ndsc; 26.12.2013

Я столкнулся с той же проблемой. Инфлятор проекта js-deflate кажется сломанным. Я обнаружил, что он будет работать с коротким вводом, но не будет работать с длинным вводом (например, lorem ipsum в качестве тестовых данных).

Лучшим вариантом оказался zlib.js.

Вот как я использую его для надувания в Javascript объекта JSON, который генерируется, сжимается и кодируется base64 на сервере:

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()));

(К вашему сведению, вспомогательные функции получены из других ответов stackoverflow).

person Archie    schedule 26.05.2014