IBM-850 编码如何使用 PHP 函数参数?
How does IBM-850 encoding work with PHP function parameters?
在this code golf answer, aross中给出了一个解决方案,大概使用IBM-850编码作为PHP中的参数值
echo preg_filter("/^(.*?[aeiouy]+)/i"," [=11=]",$argn);
echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn); # Encoded
这是如何工作的?为什么不引用参数?为什么只有参数被编码而其余代码没有被编码?
它与 IBM-850, that's just a codepage filling out the 8th bit beyond ASCII 没有太多关系来表示您最终得到的字节。
这里的关键是 bitwise not operator ~
翻转所有位 - 0 变为 1,1 变为 0。如果将 ~"/^(.*?[aeiouy]+)/i"
转储到文件并以 850 格式打开它,它将看起来像:
ðíÎÐı└ñ×ÜûÉèåóÈÍðû
同样 ~" [=16=]"
看起来像:
█╬▀█╬▀█¤
所以你看到了它的发展方向。
在PHP中,假定未定义常量具有与其名称匹配的字符串值。例如:
var_dump(foo);
输出 string(3) "foo"
(以及通知 "Use of undefined constant foo - assumed 'foo'",如果通知已打开。)
当上面两个乱七八糟的字符串中的任何一个被放入不带引号的 PHP 脚本中时,它们将被视为未定义的常量,它们的名称也被假定为它们的值。
现在在每个前面加上 ~
以翻转它们的位,您就得到了原始的正则表达式和替换字符串:
preg_filter("/^(.*?[aeiouy]+)/i"," [=13=]",$argn)
只有那些参数的位被翻转了,因为它们是唯一的字符串文字,这就是这个技巧适用的地方。对于每个字符串,它都会去掉一对引号,以换取只使用一个波浪号。
必须进行位翻转,因为没有引号的原始字符串中的任何一个都会导致解析错误。
净两个字节的聪明方法。
在this code golf answer, aross中给出了一个解决方案,大概使用IBM-850编码作为PHP中的参数值
echo preg_filter("/^(.*?[aeiouy]+)/i"," [=11=]",$argn);
echo preg_filter(~ðíÎÐı└ñ×ÜûÉèåóÈÍðû,~█╬▀█╬▀█¤,$argn); # Encoded
这是如何工作的?为什么不引用参数?为什么只有参数被编码而其余代码没有被编码?
它与 IBM-850, that's just a codepage filling out the 8th bit beyond ASCII 没有太多关系来表示您最终得到的字节。
这里的关键是 bitwise not operator ~
翻转所有位 - 0 变为 1,1 变为 0。如果将 ~"/^(.*?[aeiouy]+)/i"
转储到文件并以 850 格式打开它,它将看起来像:
ðíÎÐı└ñ×ÜûÉèåóÈÍðû
同样 ~" [=16=]"
看起来像:
█╬▀█╬▀█¤
所以你看到了它的发展方向。
在PHP中,假定未定义常量具有与其名称匹配的字符串值。例如:
var_dump(foo);
输出 string(3) "foo"
(以及通知 "Use of undefined constant foo - assumed 'foo'",如果通知已打开。)
当上面两个乱七八糟的字符串中的任何一个被放入不带引号的 PHP 脚本中时,它们将被视为未定义的常量,它们的名称也被假定为它们的值。
现在在每个前面加上 ~
以翻转它们的位,您就得到了原始的正则表达式和替换字符串:
preg_filter("/^(.*?[aeiouy]+)/i"," [=13=]",$argn)
只有那些参数的位被翻转了,因为它们是唯一的字符串文字,这就是这个技巧适用的地方。对于每个字符串,它都会去掉一对引号,以换取只使用一个波浪号。
必须进行位翻转,因为没有引号的原始字符串中的任何一个都会导致解析错误。
净两个字节的聪明方法。