【发布时间】:2015-01-12 19:36:32
【问题描述】:
如何正确压缩字符串,以便 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 可以读取它:
something(十六进制转储):
Android:1f8b08000000000000002bcecf4d2dc9c8cc4b0700fb31da0909000000
PHP:789c2bcecf4d2dc9c8cc4b0700134703cf
最奇怪的是,通过将GZOutputStream 更改为DeflaterOutputStream 它解决了something 字的问题,但问题仍然出现在更长的字符串...
附言。从 Android 生成的数据中删除标题 10 个字符根本没有帮助。
编辑:我尝试在 PHP 中解压缩它:
-
gzdecode()- 这个函数在标准的 Debian PHP5 中不存在 版本。 -
gzdecompress()- 不起作用
还有一些从 PHP 站点 cmets 模拟 gzdecode() 的函数,这些函数并没有真正做太多。
以上所有,删除前 10 个字节并保留它们。
PS2。我尝试了 Stack Overflow 和其他来源的每一个解决方案,但仍然没有。它不是重复的。
EDIT2 (BINARY DUMP):使用 Android 生成的示例数据无法通过来自 PHP.NET:data.compressed 的 gzuncompress() 或 pseudo-gzdecode() 函数解压缩。
解压后应该是一些JSON。
【问题讨论】:
-
这里的 cmets 有点“发热”,所以我把它们移走了。如果你不能文明,就不要发帖。
-
在所有 cmets 被立即删除后,我正在替换我的十六进制注释:您的十六进制转储缺少所有前导零。您需要每个字节打印两个十六进制数字,否则一串十六进制数字是不明确的。我编辑了您的问题以修复十六进制转储。
-
啊好吧,我现在明白十六进制有什么问题了。咖啡的奇迹。我在
EDIT2中链接了二进制转储。 -
您是否有可能手动压缩数据,然后通过默认自动压缩的方法将其发送到服务器,例如HttpURLConnection,还是类似的?
-
双重压缩已经在我的回答中。自 EDIT2 提供实际数据后不久。