在 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: 1f8b08000000000000002bcecf4d2dc9c8cc4b0700
fb31da0909000000
PHP: 789c2bcecf4d2dc9c8cc4b0700
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
: 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()
关于结果。
如何正确压缩字符串,以便 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: 1f8b08000000000000002bcecf4d2dc9c8cc4b0700
fb31da0909000000
PHP: 789c2bcecf4d2dc9c8cc4b0700
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
: 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()
关于结果。