2016-04-14 6 views
0

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

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. Decode
  2. компресс
  3. шифровать
  4. сохранить
  5. получить
  6. расшифровывает
  7. распаковка
  8. закодировать.

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

+0

'новый ByteArrayOutputStream (data.length)' => Если вы распаковку данных, может быть, вам нужен больший буфер, чем вход. –

+0

@AndyTurner Увеличил его 10 раз, не имел никакого значения. любое представление о белых пространствах? –

+0

Я очень подозрительно отношусь к вашему первоначальному вызову 'Base64.decode' в' compressString' - вы не проходите в кодировке Base64. Если бы я должен был догадаться, я бы сказал, что это место, где пробелы разделены. –

ответ

1

В compressString заменить:

Base64.decode(uncompressedString) 

с

uncompressString.getBytes(StandardCharsets.UTF_8) 

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

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

Base64.encode(bytes) 

с

new String(bytes, StandardCharsets.UTF_8) 
+0

@ Спасибо, это сработало. Я слишком усложнил его, используя base64 без необходимости. –

 Смежные вопросы

  • Нет связанных вопросов^_^