Сжатие и кодирование дают неверные результаты в строках

Я пытаюсь сжать строку. Я использую кодировку и декодирование Base64 для преобразования строки в байты и наоборот.

import org.apache.axis.encoding.Base64;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

public class UtilTesting {
    public static void main(String[] args) {


        try {
            String original = "I am the god";
            System.out.println("Starting Zlib");
            System.out.println("==================================");
            String zcompressed = compressString(original);
            String zdecompressed = decompressString(zcompressed);
            System.out.println("Original String: "+original);
            System.out.println("Compressed String: "+zcompressed);
            System.out.println("Decompressed String: "+zdecompressed);
        } catch (IOException e) {
            e.printStackTrace();
        }


    public static String compressString(String uncompressedString){
        String compressedString = null;
        byte[] bytes = Base64.decode(uncompressedString);
        try {
            bytes = compressBytes(bytes);
            compressedString = Base64.encode(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return compressedString;
    }

    public static String decompressString(String compressedString){
        String decompressedString = null;
        byte[] bytes = Base64.decode(compressedString);
        try {
            bytes = decompressBytes(bytes);
            decompressedString = Base64.encode(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DataFormatException e) {
            e.printStackTrace();
        }
        return decompressedString;
    }

    public static byte[] compressBytes(byte[] data) throws IOException {
        Deflater deflater = new Deflater();
        deflater.setInput(data);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
        deflater.finish();
        byte[] buffer = new byte[1024];
        while (!deflater.finished()) {
            int count = deflater.deflate(buffer); // returns the generated code... index
            outputStream.write(buffer, 0, count);
        }
        outputStream.close();
        byte[] output = outputStream.toByteArray();
        return output;
    }

    public static byte[] decompressBytes(byte[] data) throws IOException, DataFormatException {
        Inflater inflater = new Inflater();
        inflater.setInput(data);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
        byte[] buffer = new byte[1024];
        while (!inflater.finished()) {
            int count = inflater.inflate(buffer);
            outputStream.write(buffer, 0, count);
        }
        outputStream.close();
        byte[] output = outputStream.toByteArray();
        return output;
    }
}

Это дает результат:

    Starting Zlib
==================================
Original String: I am the god
Compressed String: eJxTXLm29YUGAApUAw0=
Decompressed String: Iamthego

Как видите, в нем отсутствуют пробелы и даже последняя буква в заданной строке.

Может кто-нибудь предложить, что не так с этим кодом. Я выполняю следующие шаги:

  1. Расшифровать
  2. компресс
  3. кодировать
  4. спасти
  5. забрать
  6. декодировать
  7. распаковывать
  8. кодировать.

Пожалуйста помоги. Спасибо.


person Pardha.Saradhi    schedule 14.04.2016    source источник
comment
new ByteArrayOutputStream(data.length) =› Если вы распаковываете данные, возможно, вам нужен буфер большего размера, чем входные данные.   -  person Andy Turner    schedule 14.04.2016
comment
@AndyTurner Увеличил в 10 раз, разницы никакой. любая идея о белых пространствах?   -  person Pardha.Saradhi    schedule 14.04.2016
comment
Я очень подозрительно отношусь к вашему первоначальному вызову Base64.decode в compressString - вы не передаете строку в кодировке Base64. Если бы мне пришлось угадывать, я бы сказал, что пробелы убраны.   -  person Andy Turner    schedule 14.04.2016


Ответы (1)


В compressString заменить:

Base64.decode(uncompressedString)

с

uncompressString.getBytes(StandardCharsets.UTF_8)

Вы не передаете строку в кодировке base64; вам просто нужны байты входной строки. Обратите внимание, что пробелы никогда не появляются в кодировке base64, поэтому они, вероятно, рассматриваются как избыточные и отбрасываются.

Аналогично в decompressString замените:

Base64.encode(bytes)

с

new String(bytes, StandardCharsets.UTF_8)
person Andy Turner    schedule 14.04.2016
comment
@Спасибо, сработало. Я слишком усложнил это, используя base64 без необходимости. - person Pardha.Saradhi; 14.04.2016