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

时间:2015-01-12 19:36:32

标签: php android gzip

如何正确压缩字符串,以便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压缩字符串...

问题似乎是Android添加了一些页眉/页脚......

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

something(HEX DUMP):

Android 1f8b0800000000000000 2bcecf4d2dc9c8cc4b0700 fb31da0909000000

PHP 789c 2bcecf4d2dc9c8cc4b0700 134703cf

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

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


编辑:我尝试用PHP解压缩它:

  • gzdecode() - 标准Debian PHP5中不存在此函数 版本
  • gzdecompress() - 无效

还有一些函数可以从PHP网站评论中模仿gzdecode(),这些评论并不是真的有用。

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

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


EDIT2(BINARY DUMP):使用Android生成的示例数据,无法由gzuncompress() pseudo-gzdecode()PHP.NET函数解压缩{{1}}:{ {3}}

它应该是解压后的一些JSON。

1 个答案:

答案 0 :(得分:3)

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

789c开头的php数据是zlib流。您使用gzcompress()进行了此操作,并使用gzuncompress()对其进行解码。

这两个流中包含的压缩数据(从2bce开始)是原始deflate数据。您可以使用gzinflate()对其进行解码,如果您碰巧在某处进行了解码,并且可以使用gzdeflate()生成原始收缩。

只是为了咆哮,gzencode()gzcompress()gzdeflate()是一些最具误导性的函数名称,因为其中只有一个与gzip有关,但都以{开头{ {1}},名称gz中没有任何内容表示zlib。

更新

" EDIT2"由于某种原因,数据被双重压缩。首先将其压缩为zlib格式,然后将该zlib流压缩为gzip格式。 (虽然gzip无法压缩已经压缩的数据,所以它要大一些。)

您应该修复使其双倍压缩的问题。或者如果你无法控制它,你可以加倍解压缩,首先使用RFC 1952规范剥离gzip头,然后在原始deflate数据上剥离gzcompress(),然后在结果上使用gzinflate()