博主这几天在捣鼓爬虫,不可避免的需要去模拟一些网站变态的加密算法(顺便吐槽一句:你们这些网站真的很不友善!)。 既然是加密算法那么位运算就是不可或缺的了。相比较javascript而言,PHP没有>>>这种无符号右移的运算符,而且就算是普通的<<左移和>>右移运算符,PHP算出来的结果也会不同于javascript。所以只能打模拟js位移运算符的主意了。 上网爬了一圈,在stackoverflow上发现一篇帖子(传送门)在聊这个问题,帖子里有贴一些>>>运算符实现的代码。遗憾的是我没能看懂,只能自己来撸一个了(已回复该帖,有缘的朋友给个up吧)。 然后的然后就有了下面的代码。各位如果有同样的困惑尽管拿去用(每个函数都配合nodejs做了10w+次的测试,应该没问题)。 /** * >>> javascript operator in php x86_64 * @param int $v * @param int $n * @return int */ function rrr($v,$n) { return ($v & 0xFFFFFFFF) >> ($n & 0x1F); } /** * >> javascript operator in php x86_64 * @param int $v * @param int $n * @return int */ function rr($v,$n) { $v = $v & 0x80000000 ? $v | 0xFFFFFFFF00000000 : $v & 0xFFFFFFFF; return $v >> ($n & 0x1F); } /** * << javascript operator in php x86_64 * @param int $v * @param int $n * @return int */ function ll($v,$n) { $t = ($v & 0xFFFFFFFF) << ($n & 0x1F); return $t & 0x80000000 ? $t | 0xFFFFFFFF00000000 : $t & 0xFFFFFFFF; } 附送一个PHP对javascript逗号运算符(,)的模拟,你懂的。 转换效果(js to PHP): if (i = 0,j = 1,k =2) {} to if (comma($i = 0,$j = 1,$k = 2)) {} /** * @param ... * @return mixed */ function comma() { $args = func_get_args(); return end($args); } 最后,为什么用PHP来做爬虫? PHP是世界上最好的语言,不接受任何反驳。 PHP的语法和javascript比较像,我想移植要容易一些吧。 我只会PHP,你们满意了吗? 为了避免代码出现横向滚动条,请假装缩进是4个空格~ 本文作者: Neo Peng 本文链接: https://zhile.io/2018/06/21/php-equivalent-javascript-bitwise-operators.html 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-ND 4.0 许可协议。转载请注明出处!
PHP模拟javascript的位移运算符
发布时间:2020-12-13 21:29:30 所属栏目:PHP教程 来源:网络整理
导读:博主这几天在捣鼓爬虫,不可避免的需要去模拟一些网站变态的加密算法(顺便吐槽一句:你们这些网站真的很不友善!)。既然是加密算法那么位运算就是不可或缺的了。相比较javascript而言,PHP没有 这种无符号右移的运算符,而且就算是普通的左移和 右移运算符
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |