php的zlib_encode()和zlib_decode不对吗?

时间:2016-06-23 17:41:57

标签: php encoding decode zlib

我写了一个函数(在php中)解码一些数据(数据先是zlib编码然后是base-64编码)。

现在我想创建一个可以反转该操作的函数 - 但是在编码数据时发生了一些奇怪的事情。我有这个字符串(这是在base64解码后所以这只是zlib编码):

xÚc22Ñ5±RÈM-ÉÈOÉLNÌQpdFZ6<€‘/`„¸Ž]œ(•šÁáÁôÀm%Âp,¦C͆êF5ÉGÄŽa:Ìl˜ndÓ‘C‹áœÈB6±¥Ä€ ¤¦¦¥¦$¥&%'¦¥df¤e¤g¤"#¡b¤c¤¡ÆÀ˜%&¯TÍ’ Ĥ'£Ç¤¤ Äà`•¢Ç §H  %=†=–%ô(`f“s0¨’c`)¥]

在原始字符串上调用zlib_encode(zlib_decode(base64_decode($data)))时,会输出NULL。我看了php's zlib_encode documentation,发现我需要给出压缩类型。好吧,也没有运气:

var_dump(zlib_encode(zlib_decode(base64_decode($data)),ZLIB_ENCODING_RAW));
var_dump(zlib_encode(zlib_decode(base64_decode($data)),ZLIB_ENCODING_GZIP));
var_dump(zlib_encode(zlib_decode(base64_decode($data)),ZLIB_ENCODING_DEFLATE));

返回

string(194) "c22Ñ5±RÈM-ÉÈOÉLNÌQpdFZ6<€Ÿ,Ðe×q¢‹s¡Ò@3!<˜¸­DŽÅt¨ÙPݨ¦#ùˆÃ1L‡™
Ól:rh2n(" ±‰0ÀÀ(%!55-5%)5©(©8©0µ(µ £0#-#=#©©µ##
5Æ,1y= j–%†$==†$%%«=9%p@²H(±¨è1Äè±d(¡G3›œƒA•"
string(212) "‹c22Ñ5±RÈM-ÉÈOÉLNÌQpdFZ6<€Ÿ,Ðe×q¢‹s¡Ò@3!<˜¸­DŽÅt¨ÙPݨ¦#ùˆÃ1L‡™
Ól:rh2n(" ±‰0ÀÀ(%!55-5%)5©(©8©0µ(µ £0#-#=#©©µ##
5Æ,1y= j–%†$==†$%%«=9%p@²H(±¨è1Äè±d(¡G3›œƒA•ˆÉl–U"
string(200) "xœc22Ñ5±RÈM-ÉÈOÉLNÌQpdFZ6<€Ÿ,Ðe×q¢‹s¡Ò@3!<˜¸­DŽÅt¨ÙPݨ¦#ùˆÃ1L‡™
Ól:rh2n(" ±‰0ÀÀ(%!55-5%)5©(©8©0µ(µ £0#-#=#©©µ##
5Æ,1y= j–%†$==†$%%«=9%p@²H(±¨è1Äè±d(¡G3›œƒA•)¥]"

因此 none 选项实际上会返回原始选项。如何撤消php的zlib_decode()

<小时/> 的修改

这是我开始的数据:

eNpjEDIy0TWxUshNLcnIT8lMTsxRcGQAAkZaAjYGPICdkQEvYIS4jhNdnAMoCJUGmsEI4cH0wG0lwnAspkPNhupGNR3JR8QYjmE6zGyYbmTTkUOLkOGcyAZCATaxEQYYGKXEgAEgpKampaYkpSYVJRUnFaYWpRZkFGakZaRnpCIVIxWhFmKkY6ShxsCYJSavB1TNkqDEkKQno8eQpKSgxOBglaLHIKcEDkgWCSUWFT2GGD2WDCX0KGBmk3MwqJJjYAAAKaUWXQ==

我使用php的base64_decode对其进行解码,然后我在帖子中找到第一个字符串。

2 个答案:

答案 0 :(得分:3)

无损压缩器的保证是zlib_decode(zlib_encode(original_data))将始终返回original_data

但无法保证zlib_encode(zlib_decode(compressed_data))将返回compressed_data。您提供的compressed_data可能已在不同的压缩级别压缩,使用不同的压缩策略,使用不同的算法,或者甚至只使用相同压缩代码的不同版本。对于相同的源数据,存在无限数量的压缩表示,并且压缩器不需要从该无限集中生成特定的一个。

只要满足无损保证,甚至不要求压缩机具有确定性。但是,您将遇到的大多数压缩代码都是确定性的。因此,虽然不能保证,但zlib_encode(original_data)很可能在使用相同的输入,zlib_encode()的相同版本和版本以及相同的选项运行时始终返回相同的结果。

现在稍微转向历史。早期版本的zlib的deflate不是确定性的,因为结果可能取决于未初始化的内存的内容。尽管deflate代码总能产生正确的结果,并且总能满足无损保证,但是非决定论会困扰民谣。所以后来被修复以确定确定性。

顺便问一下,你为什么关心?为什么需要复制相同的压缩数据(你知道你可以复制,对吧?),只要你确信在解压缩时你会得到原始数据?

答案 1 :(得分:1)

如果编码两次,则应使用相反的顺序进行解码。

所以:

$data = base64_encode($data);
$data = zlib_encode($data);

编码和解码:

$data = zlib_decode($data);
$data = base64_decode($data);

我不确定,但你似乎错了这个订单?