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:
- Decode
- Kompresse
- kodieren
- speichern
- dekodieren
- decompress
- kodieren abzurufen.
Bitte helfen. Vielen Dank.
'neuer ByteArrayOutputStream (data.length)' => Wenn Sie Daten dekomprimiert, vielleicht brauchen Sie einen größeren Puffer als die Eingang. –
@AndyTurner erhöhte es 10 Mal, machte keinen Unterschied. irgendeine Vorstellung von den weißen Räumen? –
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. –