在 Android 中编码字符串,以便 PHP 能够 gzdecompress 它?

Encode string in Android so PHP would be able to gzdecompress it?

如何正确压缩字符串,以便 PHP 能够解压?

我试过这个:

public static byte[] compress(String string) throws IOException {
    ByteArrayOutputStream os = new ByteArrayOutputStream(string.length());
    DeflaterOutputStream gos = new DeflaterOutputStream(os);
    // ALSO TRIED GZOutputStream, same results!
    gos.write(string.getBytes());
    gos.close();
    byte[] compressed = os.toByteArray();
    os.close();
    return compressed;
}

但是 PHP 无法将输出识别为有效的 GZip 压缩字符串...

问题似乎出在某些 headers / 由 Android 添加的页脚中...

例如,当我通过 PHP 和 gzcompress 压缩 something 单词时,我得到了与 Android 相似的结果,但不够相似,所以 PHP 可以阅读:

something(十六进制转储):

Android: 1f8b08000000000000002bcecf4d2dc9c8cc4b0700fb31da0909000000

PHP: 789c2bcecf4d2dc9c8cc4b0700134703cf

最奇怪的是,通过将GZOutputStream更改为DeflaterOutputStream它解决了something字的问题,但是问题仍然出现在更长的字符串...

PS。从 Android 生成的数据中删除标题 10 个字符根本没有帮助。


编辑:我试图在 PHP 中解压它:

还有一些从 PHP 站点评论中模拟 gzdecode() 的功能,但实际上并没有做太多。

以上所有,删除前 10 个字节并保留它们。

PS2。我尝试了 Stack Overflow 和其他来源的每一个解决方案,但仍然一无所获。它不是重复的。


EDIT2 (BINARY DUMP):使用 Android 生成的样本数据不能被 gzuncompress()pseudo-gzdecode() 函数解压PHP.NET: data.compressed.

解压后应该是JSON

1f8b开头的Android数据是一个gzip流。在 php 中,您为此使用 gzdecode()gzencode() 在 php 上生成 gzip 流。

789c开头的php数据是一个zlib流。你用 gzcompress() 来制作它,你会用 gzuncompress() 来解码它。

这两个流中包含的压缩数据,以 2bce 开头,是原始压缩数据。如果你碰巧把它放在某个地方,你可以使用 gzinflate() 来解码,你可以使用 gzdeflate() 来生成原始压缩。

吐槽一下,gzencode()gzcompress()gzdeflate() 是有史以来最具误导性的一些函数名称,因为其中只有一个与 gzip 有关,但都开始了使用 gz,名称 gzcompress() 中没有任何内容表示 zlib。

更新:

"EDIT2" 数据由于某种原因被双重压缩。它首先被压缩为 zlib 格式,然后 zlib 流被压缩为 gzip 格式。 (虽然gzip压缩不了已经压缩过的数据,所以还是有点大。)

您应该修复导致其双重压缩的问题。或者,如果您无法控制它,您可以双重解压缩它,首先使用 RFC 1952 规范剥离 gzip header,然后对原始压缩数据进行 gzinflate(),然后使用 gzdecompress()关于结果。