【问题标题】:What's the different between javascript deflate and java.util.zip.Deflaterjavascript deflate 和 java.util.zip.Deflater 有什么区别
【发布时间】:2026-01-27 02:20:11
【问题描述】:

我写了一些 Javascript 代码。 用base64压缩并放气

function base64 (str) {
    return new Buffer(str).toString("base64");
}

function deflate (str) {
    return RawDeflate.deflate(str);
}

function encode (str) {
    return base64(deflate(str));
}
var str = "hello, world";
console.log("Test Encode");
console.log(encode(str));

我将“你好,世界”转换为 2f8d48710d6e4229b032397b2492f0c2

我想在java中解压这个字符串(2f8d48710d6e4229b032397b2492f0c2)

我把 str 放到一个文件中,然后:

public static String decompress1951(final String theFilePath) {
    byte[] buffer = null;

    try {
        String ret = "";
        System.out.println("can come to ret");

        InputStream in = new InflaterInputStream(new Base64InputStream(new FileInputStream(theFilePath)), new Inflater(true));
        System.out.println("can come to in");
        while (in.available() != 0) {
            buffer = new byte[20480];
*****line 64 excep happen            int len = in.read(buffer, 0, 20480);
            if (len <=0) {
                break;
            }
            ret = ret + new String(buffer, 0, len);
        }
        in.close();
        return ret;

    } catch (IOException e) {
        System.out.println("Has IOException");
        System.out.println(e.getMessage());

        e.printStackTrace();
    }
    return "";
}

但我有一个例外:

java.util.zip.ZipException: invalid stored block lengths
    at java.util.zip.InflaterInputStream.read(Unknown Source)
    at com.cnzz.mobile.datacollector.DecompressDeflate.decompress1951(DecompressDeflate.java:64)
    at com.cnzz.mobile.datacollector.DecompressDeflate.main(DecompressDeflate.java:128)

【问题讨论】:

  • 代码对了,关键是InflaterInputStream的第二个参数new Inflater(true)。没有这个参数,代码可以工作,但不是纯粹的defalter。可能与 RFC1950 zlib 不同:basic links。 (无)RFC 1951 deflate:basic links。 (with new Inflater(true)) 而“hello, world”转换后的字符串不是2f8d48710d6e4229b032397b2492f0c2。这就是为什么我无法解决它

标签: java javascript base64 deflate inflate


【解决方案1】:

上面的 java 代码运行良好。正如评论中一样,您不知何故弄错了编码值。我使用 javascript 值得到的编码值为y0jNycnXUSjPL8pJAQA=

然后,当您将此值复制到文件并调用decompress1951 时,您实际上会根据需要返回hello, world。不知道在 javascript 部分该说什么,因为您使用的代码似乎与分发网页上的示例很好地同步。我注意到有the originalthe fork 所以那里可能有些混乱?无论如何,如果你想看看这个jsfiddle,我认为它可以被视为一个工作版本。

【讨论】: