php的zlib_encode()和zlib_decode不相反吗?

Are php's zlib_encode() and zlib_decode not opposite?

我写了一个函数(在 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));

returns

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的选项其实是return原来的。如何反转 php 的 zlib_decode()


编辑

这是我开始的数据:

eNpjEDIy0TWxUshNLcnIT8lMTsxRcGQAAkZaAjYGPICdkQEvYIS4jhNdnAMoCJUGmsEI4cH0wG0lwnAspkPNhupGNR3JR8QYjmE6zGyYbmTTkUOLkOGcyAZCATaxEQYYGKXEgAEgpKampaYkpSYVJRUnFaYWpRZkFGakZaRnpCIVIxWhFmKkY6ShxsCYJSavB1TNkqDEkKQno8eQpKSgxOBglaLHIKcEDkgWCSUWFT2GGD2WDCX0KGBmk3MwqJJjYAAAKaUWXQ==

我用 php 的 base64_decode 解码它,之后我得到 post 中的第一个字符串。

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

所以:

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

编码和解码:

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

我不确定,但你好像把这个顺序弄错了?

无损压缩器的保证是zlib_decode(zlib_encode(original_data))永远returnoriginal_data.

然而,无法保证 zlib_encode(zlib_decode(compressed_data)) 会 return compressed_data。您提供的 compressed_data 可能已经在不同的压缩级别、不同的压缩策略、不同的算法甚至只是使用相同压缩代码的不同版本进行了压缩。同一源数据有无限多的压缩表示形式,压缩器无需从无限集中产生特定的表示形式。

甚至不要求压缩器是确定性的,只要满足无损保证即可。然而,您将遇到的大多数压缩代码都是确定性的。因此,虽然不能保证,但很可能 zlib_encode(original_data) 总是 return 当 运行 使用相同的输入、相同的版本和构建 zlib_encode() 时,结果相同,并且相同的选项。

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

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