首頁 > 後端開發 > php教程 > des加密解密算法 - 怎么可以让php代码:62837 << -16 在windows和linux中得到相同的结果?

des加密解密算法 - 怎么可以让php代码:62837 << -16 在windows和linux中得到相同的结果?

WBOY
發布: 2016-07-06 13:52:46
原創
1010 人瀏覽過

进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。

网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教

win的结果:-176881664
lin的结果:-759700962142060544

@eechen

回复内容:

进行des加密操作,发现在windows和linux里得到的结果不一样,发现是createkey过程中有这个运算,从这里开始不一样的。

网络查询得知是int溢出导致,windows下是正确的。建议通过gmp扩展来操作,但是并未找到具体用法,求指教

win的结果:-176881664
lin的结果:-759700962142060544

@eechen

恭喜你掉到php的一个大坑了。

如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。

就是这个问题导致了各种匪夷所思的问题。

PHP 不支持无符号整数。

引用php原文

然而,你出现此问题是因为你两个系统的long型(php的int型在内核中均为long型)长度不一致(因为系统位数不一样)。
所以,你如要想解决此问题,就必须手动处理int到uint。

<code class="php">$flag=$int&0x80000000;
//取出符号位,判断是否是负数,溢出int范围,但没溢出uint范围时,符号位为1,即为负数
if($flag){
    $int ^= 0xffffffff;
    $int += 1;
}
</code>
登入後複製

BTW,最新的php7修正了此问题,但php中无法移位一个负数。

不知道这段代码是从何而来的,左右移负数的代码是由CPU完成运算的,所以这里完全依赖机器,与系统关系都不大,看看能不能修正这段代码,或者只能是使用其他方法来代替左右移负数了。

所以从 php7 开始,位移一个负数会直接报错...

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板