Java распаковка массива байтов


На сервере (C++) двоичные данные сжимаются с помощью функции ZLib:

compress2()

И он передается клиенту (Java). На стороне клиента (Java) данные должны быть распакованы с использованием следующего фрагмента кода:

public static String unpack(byte[] packedBuffer) {
    InflaterInputStream inStream = new InflaterInputStream(new ByteArrayInputStream( packedBuffer);
    ByteArrayOutputStream outStream = new ByteArrayOutputStream();
    int readByte;
    try {
        while((readByte = inStream.read()) != -1) {
            outStream.write(readByte);
        }
    } catch(Exception e) {
        JMDCLog.logError(" unpacking buffer of size: " + packedBuffer.length);
        e.printStackTrace();
    // ... the rest of the code follows
}

Проблема в том, что когда он пытается читать в цикле while, он всегда бросает:

Java.утиль.застежка-молния.ZipException: недопустимые длины хранимых блоков

Прежде чем я проверю другие возможные причины, может кто-нибудь, пожалуйста, сказать мне, могу ли я сжать на одной стороне с compress2 и распаковать его с другой стороны, используя приведенный выше код, так что я могу устранить эту проблему? Кроме того, если у кого-то есть возможная подсказка о том, что может быть неправильно Здесь (я знаю, что не предоставил слишком много кода здесь, но проекты довольно большие.

Спасибо.

2 2

2 ответа:

InflaterInputStream ожидает необработанные дефляционные данные (RFC 1951 ), в то время как compress2() производит zlib-обернутые дефляционные данные (RFC 1950 вокруг RFC 1951).

Inflater с другой стороны, обрабатывает данные в zlib-оболочке (если вы не даете ему опцию nowrap). Иди разберись.

Я думаю, что проблема не в методе распаковки, а в содержимом packedBuffer. Распаковать работает нормально

public static byte[] pack(String s) throws IOException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    DeflaterOutputStream dout = new DeflaterOutputStream(out);
    dout.write(s.getBytes());
    dout.close();
    return out.toByteArray();
}

public static void main(String[] args) throws Exception {
    byte[] a = pack("123");
    String s = unpack(a);   // calls your unpack
    System.out.println(s);
}

Вывод

123