php - 在 Android 中对字符串进行编码,以便 PHP 能够对其进行 gz 解压缩?

标签 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 添加的某些页眉/页脚中......

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

某事(十六进制转储):

Android:1f8b08000000000000002bcecf4d2dc9c8cc4b0700fb31da0909000000

PHP:789c2bcecf4d2dc9c8cc4b0700134703cf

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

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


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

  • gzdecode() - 标准 Debian PHP5 中不存在此函数 版本。
  • gzdecompress() - 不起作用

还有一些从 PHP 站点注释中模拟 gzdecode() 的函数,但实际上作用不大。

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

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


EDIT2(二进制转储):使用 Android 生成的示例数据,无法通过 gzuncompress()pseudo-gzdecode() 解压缩> 来自 PHP.NET 的函数:data.compressed .

解压后应该是一些 JSON。

最佳答案

1f8b开头的Android数据是gzip流。在 php 中,您可以使用 gzdecode() 来实现这一点。 php 上的 gzencode() 生成 gzip 流。

789c开头的php数据是zlib流。您使用 gzcompress() 来实现这一点,然后使用 gzuncompress() 对其进行解码。

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

顺便说一句,gzencode()gzcompress()gzdeflate() 是有史以来最具有误导性的函数名称,因为其中只有一个与 gzip 相关,但都以 gz 开头,并且名称 gzcompress() 中没有任何内容表示 zlib。

更新:

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

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

关于php - 在 Android 中对字符串进行编码,以便 PHP 能够对其进行 gz 解压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909435/

相关文章:

php - 警告 : Missing Argument 1

java - renderscript可以在jni代码中使用吗?

python - 读取当前正在写入的 gzip 文件

PHP解码json并显示

java - 使用 jQueryUI datepicker 和 php 获取一系列日期(西类牙语)

php - Soundcloud 401错误/无效的PHP封装授予

java - 如何解析包含数组的空值 JSON

java - Android - SQlite插入不插入

c++ - 如何使用miniz创建一个可以用gzip解压的压缩文件?

linux - "tar cf xxxx | gzip -n"与 "tar zcf xxxx"之间有什么区别吗?