【发布时间】:2012-04-09 07:48:31
【问题描述】:
几年前,我的虚拟主机从 32 位更改为 64 位,并且一个关键的 PHP 脚本停止工作。这是由于 >(位移位)操作发生了变化。我可以通过将 rotateleft 和 rotateright 例程替换为 rotateleft32 和 rotateright32 来解决我的问题,如下所示:
function rotateleft($value, $numleft) {
return (($value << $numleft) | ($value >> (32-$numleft)));
}
function rotateleft32($value, $numleft) {
return ((($value << $numleft) | ($value >> (32-$numleft))) & 0xFFFFFFFF);
}
function rotateright($value, $numright) {
return (($value >> $numright) | ($value << (32-$numright)));
}
function rotateright32($value, $numright) {
return ((($value >> $numright) | ($value << (32-$numright))) & 0xFFFFFFFF);
}
我现在遇到了一组新的代码,似乎是完全相同的问题,但更复杂:
function ECC_RotateLeft($a)
{
$copya = makecopy($a);
$bit = ($copya->e[0] & ECC_UPRBIT) ? 1 : 0;
/* looped
for ($i = 0; $i < ECC_MAXLONG - 1; $i++)
$copya->e[$i] = ($copya->e[$i] << 1) | (($copya->e[$i + 1] & ECC_MSB) ? 1 : 0);
$copya->e[0] &= ECC_UPRMASK;
looped */
/* unlooped */
// These lines are optimized for ECC_MAXLONG==4 only!
$bit = ($copya->e[0] & ECC_UPRBIT) ? 1 : 0;
$copya->e[0] = (($copya->e[0] << 1) & ECC_UPRMASK) | (($copya->e[1] & ECC_MSB) ? 1 : 0);
$copya->e[1] = ($copya->e[1] << 1) | (($copya->e[2] & ECC_MSB) ? 1 : 0);
$copya->e[2] = ($copya->e[2] << 1) | (($copya->e[3] & ECC_MSB) ? 1 : 0);
/* unlooped */
$copya->e[3] = ($copya->e[3] << 1) | $bit;
return $copya;
}
function ECC_RotateRight($a)
{
$copya = makecopy($a);
$bit = ($copya->e[ECC_NUMWORD] & 1) ? ECC_UPRBIT : 0;
/* looped
for ($i = ECC_MAXLONG - 1; $i > 0; $i--)
$copya->e[$i] = (($copya->e[$i] >> 1) & 0x7FFFFFFF) | (($copya->e[$i - 1] & 1) ? ECC_MSB : 0);
looped */
/* unlooped */
// Thes lines are optimized for ECC_MAXLONG==4 only!
$copya->e[3] = (($copya->e[3] >> 1) & 0x7FFFFFFF) | (($copya->e[2] & 1) ? ECC_MSB : 0);
$copya->e[2] = (($copya->e[2] >> 1) & 0x7FFFFFFF) | (($copya->e[1] & 1) ? ECC_MSB : 0);
$copya->e[1] = (($copya->e[1] >> 1) & 0x7FFFFFFF) | (($copya->e[0] & 1) ? ECC_MSB : 0);
/* unlooped */
$copya->e[0] = (($copya->e[0] >> 1) & 0x7FFFFFFF) | $bit;
return $copya;
}
我在尝试自己解决这个问题时遇到了三个问题:
- 这不是我的代码,所以我不熟悉它要做什么。
- 我不再有 32 位服务器来测试它
- 我足够了,但不是 PHP 专家。
我想知道是否有人确实看到了一个简单的修复程序,以允许此代码在 64 位服务器上运行并提供与在 32 位服务器上相同的结果。
如果没有,鉴于我没有可比较的 32 位结果,你会建议我如何调试它?
以下是有关此问题的一些讨论,并试图让开发人员修复它: How to get the outdated 32bit keymaker.php Script Working on 64 bit
【问题讨论】:
-
您应该设置一个 32 位版本的 PHP,也许首先运行一个 32 位 VM。
-
另外,如果你不能进行正面比较,你怎么知道是上面的代码有问题?
-
@OliCharlesworth:这是一个有根据的猜测,基于我最初需要的修复以及我随后提出的相关 Stackoverflow 问题:stackoverflow.com/questions/397738/32-to-64-bit-gotchas-in-php
标签: php algorithm bit-manipulation 32bit-64bit