如何正确压缩字符串,以便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。
答案 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()
。