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 确定性。
顺便问一下,你为什么关心?为什么需要复制相同的压缩数据(你知道你可以复制,对吧?),只要你确信你在解压时会得到原始数据吗?
我写了一个函数(在 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 确定性。
顺便问一下,你为什么关心?为什么需要复制相同的压缩数据(你知道你可以复制,对吧?),只要你确信你在解压时会得到原始数据吗?