【问题标题】:Base64 decode and uncompress a stringBase64 解码和解压缩字符串
【发布时间】:2024-01-08 02:12:01
【问题描述】:

我有一个字符串,它首先被压缩(不是 gzip),然后是 base64 编码。 我想再次获得纯文本。以下代码

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

抛出异常:

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)

我猜,我又混淆了输入/输出充气/放气

这是经过压缩和base64编码的数据:

eJx1U2tzqjAQ/SsO96NTw1PBQTr4qlgtyqvVL3cihEehiSYg1l9/rd46dZx+y549Ocme3dUfDx9FY48oywjucUKL5xoIhyTKcNLjfG/8oHINVkIcwYJg1OMw4R4N3c0SDMuKokW1eUafNo0QHcISNk5qmPW4tCy3XQDqum6hTRayFqEJcHle4C6MbnRLqqUzQ+R5HvAaOHEiliV/vtlnjR5XUdw90S5hd8Lz8jfhwLJf9ATwNp+5YYo+4EOGvyoJ0ekWy7rsDM5ICMtz7b/+uXH/Ljgf/7JvG1oHFnF3tlg4JoZ+OQewqJChR6zruOZNPCdRVVTMMOebJcxHZRJ1kqeDJJqfR6IQJDdngt1cBt5ncYKnO8d99Tp9gYoweT2O40BUatURhWKZvVHV7E8102XHXTDN5ZI1vZyX6KKeSm+SmK9VlQZ5nZeKvd8X7aPUmRztxdp8rtaZom1kJlsRqsK95RSS7RJ7AYOQbg6S2vZXrjWA6S5vqzlWYCG/z947YgXjcOasFuF8/JKs34nngCGYIVBukJd9jLHftuQSmfV6LJFg2CQrU5Ze4qJYpR1/b5qD2MaOvSv27Z1PV4GA+p1U1IDFWLJaifGEKmGKxZ3lq5Ox0EHb1G++JvGIpaSayxYd9J2kfO7nhXiw4XYYD3fyJsbC8kmDVv2iJZqqaAtnn/d08MPkL8NHh+1plHFpmEtzcM5ekXN00yBw075rg4PLxhgmz7d1cAf/gG5GAdISI2oNjVHfGried5K/QrrPfqYUHfwH7sSu62b8A39iR +Y=

【问题讨论】:

  • 压缩可能是错误的;显示它的代码。在这里我会为跨平台清晰度(代码检查器)做:string.getBytes(StandardCharsets.US_ASCII)new String(output2, StandardCharsets.UTF_8) 或压缩时使用的内容。
  • 请注意,您可以使用内部使用 ISO-8859-1 字符集的 Base64.decodeBase64(string); 而不是 Base64.decodeBase64(string.getBytes());。另请注意Inflater(boolean) 上的 JavaDoc:“使用 'nowrap' 选项时,还需要提供额外的“虚拟”字节作为输入。” - 因此您可能需要在decodedBytes 前添加一个字节。但是,由于您声明“不是 gzip”,您可能希望禁用与 GZIP 兼容的解压缩并因此传递 false 或使用无参数构造函数。
  • 压缩必须是纯 zip 压缩,因为它是按照数据被管理的标准所要求的
  • @MartinMüller 正如 Thomas 已经提到的,如果您想使用纯 Zip 压缩,您应该使用 false 调用 Inflater 构造函数。
  • 好的,通过将 true 更改为 false 不再发生异常。但我的输出是:decode_decompress - Data: [B@1fc2b765 I 除了 XML 作为数据

标签: java base64 unzip


【解决方案1】:

这解决了问题:

private void decode_decompress(String string) {
    byte[] decodedBytes = Base64.decodeBase64(string);
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    Inflater decompresser = new Inflater(false);
    InflaterOutputStream inflaterOutputStream = new InflaterOutputStream(stream, decompresser);
    try {
        inflaterOutputStream.write(decodedBytes);
        inflaterOutputStream.close();
        String data = stream.toString();
        logger.info("Data: {}", data);
    } catch (IOException e) {
        logger.error(string, e);
    }
}

【讨论】:

    最近更新 更多