2016-04-14 28 views
0

Ich versuche, eine Zeichenfolge zu komprimieren. Ich benutze Base64 Kodierung und Dekodierung zur Umwandlung von String in Bytes und umgekehrt.Komprimierung und Codierung geben falsche Ergebnisse in Strings

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; 
    } 
} 

Dies gibt das Ergebnis:

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

Wie Sie sehen können, ist es die weißen Räume fehlen und es verlor auch die letzten Buchstaben im angegebenen String.

Kann jemand bitte vorschlagen, was mit diesem Code falsch ist. Ich folge folgenden Schritte aus:

  1. Decode
  2. Kompresse
  3. kodieren
  4. speichern
  5. dekodieren
  6. decompress
  7. kodieren abzurufen.

Bitte helfen. Vielen Dank.

+0

'neuer ByteArrayOutputStream (data.length)' => Wenn Sie Daten dekomprimiert, vielleicht brauchen Sie einen größeren Puffer als die Eingang. –

+0

@AndyTurner erhöhte es 10 Mal, machte keinen Unterschied. irgendeine Vorstellung von den weißen Räumen? –

+0

Ich bin sehr verdächtig über Ihren ersten Aufruf von 'Base64.decode' in' compressString' - Sie übergeben keine Base64-codierte Zeichenfolge. Wenn ich raten müsste, würde ich sagen, dass dort die Räume entfernt sind. –

Antwort

1

In compressString ersetzen:

Base64.decode(uncompressedString) 

mit

uncompressString.getBytes(StandardCharsets.UTF_8) 

Sie sind nicht in einem Base64-codierten String übergeben; Sie möchten einfach die Bytes der Eingabezeichenfolge. Beachten Sie, dass Leerzeichen niemals in der base64-Codierung angezeigt werden. Daher werden sie wahrscheinlich als redundant behandelt und verworfen.

ähnlich in decompressString ersetzen:

Base64.encode(bytes) 

mit

new String(bytes, StandardCharsets.UTF_8) 
+0

@Danke, es hat funktioniert. Ich habe es kompliziert, indem ich unnötigerweise base64 benutze. –