我写了一个函数(在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
对其进行解码,然后我在帖子中找到第一个字符串。
答案 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);
我不确定,但你似乎错了这个订单?