Ich habe eine Zeichenfolge, die zuerst gezippt (nicht gzip) und dann Base64 codiert wird. Ich möchte den Klartext erneut haben. Folgenden CodeBase64 entschlüsseln und Dekomprimieren einer Zeichenfolge
private void decode_decompress(String string) {
byte[] decodedBytes = Base64.decodeBase64(string.getBytes());
ByteArrayOutputStream stream = new ByteArrayOutputStream();
Inflater decompresser = new Inflater(true);
InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream, decompresser);
try {
inflaterOutputStream.write(decodedBytes);
inflaterOutputStream.close();
byte[] output2 = stream.toByteArray();
logger.info("Data: {}", output2.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
löst eine Ausnahme:
java.util.zip.ZipException: invalid stored block lengths
at java.util.zip.InflaterOutputStream.write(InflaterOutputStream.java:273)
at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
at de.martinm.tools.EBICS.DSTools.decode_decompress(DSTools.java:87)
at de.martinm.tools.EBICS.DSTools.process(DSTools.java:77)
at de.martinm.tools.EBICS.DSTools.main(DSTools.java:100)
Ich denke, ich bin Mischen wieder Eingabe/Ausgabe aufblasen/deflate
Hier die Daten, die komprimiert und Base64 codiert:
eJx1U2tzqjAQ/SsO96NTw1PBQTr4qlgtyqvVL3cihEehiSYg1l9/rd46dZx + y549Ocme3dUfDx9FY48oywjucUKL5xoIhyTKcNLjfG/8oHINVkIcwY Jg1OMw4R4N3c0SDMuKokW1eUafNo0QHcISNk5qmPW4tCy3XQDqum6hTRayFqEJcHle4C6MbnRLqqUzQ R5HvAaOHEiliV +/+ vtlnjR5XUdw90S5hd8Lz8jfhwLJf9ATwNp 5YYo + 4EOGvyoJ0ekWy7rsDM5ICMtz7b/+ uXH/Ljgf/7JvG1oHFnF3tlg4JoZ + OQewqJChR6zruOZNPCdRVVTMMOebJcxHZRJ1kqeDJJqfR6IQJDdngt1cBt5ncYKnO8d99Tp9gYoweT2O40BUatURhWKZvVHV7E8102XHXTDN5ZI1vZyX6KKeSm + SmK9VlQZ5nZeKvd8X7aPUmRztxdp8rtaZom1kJlsRqsK95RSS7RJ7AYOQbg6S2vZXrjWA6S5vqzlWYCG/z947YgXjcOasFuF8/JKs34nngCGYIVBukJd9jLHftuQSmfV6LJFg2CQrU5Ze4qJYpR1/b5qD2MaOvSv27Z1PV4GA + ++ p1U1IDFWLJaifGEKmGKxZ3lq5Ox0EHb1G JvGIpaSayxYd9J2kfO7nhXiw4XYYD3fyJsbC8kmDVv2iJZqqaAtnn/d08MPkL8NHh + 1plHFpmEtzcM5ekXN00yBw075rg4PLxhgmz7d1cAf/gG5GAdISI2oNjVHfGried5K/QrrPfqYUHfwH7sSu62b8A39iR + Y =
Die Komprimierung ist wahrscheinlich falsch; Zeige seinen Code. Hier würde ich für plattformübergreifende Klarheit (Code-Checker) tun: 'string.getBytes (StandardCharsets.US_ASCII)' und 'new String (output2, StandardCharsets.UTF_8)' oder was beim Komprimieren verwendet wird. –
Beachten Sie, dass anstelle von 'Base64.decodeBase64 (string.getBytes());' Sie einfach 'Base64.decodeBase64 (string);' verwenden könnten, die intern den ISO-8859-1-Zeichensatz verwendet. Beachten Sie auch das JavaDoc auf 'Inflater (boolean)': "Wenn Sie die Option 'nowrap' verwenden, müssen Sie zusätzlich ein zusätzliches 'Dummy' Byte als Eingabe angeben." - Sie müssen also möglicherweise ein Byte an "decodiertBytes" übergeben. Da Sie jedoch "not gzip" angegeben haben, möchten Sie wahrscheinlich die GZIP-kompatible Dekomprimierung deaktivieren und daher "false" übergeben oder den Konstruktor ohne Argumente verwenden. – Thomas
Die Komprimierung muss reine Zip-Komprimierung sein, wie es der Standard fordert, für den die Daten –