몇 년 전 웹 호스트가 32 비트에서 64 비트로 변경되었으며 중요한 PHP 스크립트가 작동을 멈췄습니다. < < 및 >> (비트 시프트) 연산이 변경 되었기 때문입니다. 나는이 같은 rotateleft32 및 rotateright32으로 rotateleft 및 rotateright 루틴을 대체하여 내 문제를 해결할 수 있었다 : 지금 정확히 같은 문제가 될 것으로 보인다 코드의 새로운 세트를 가로 질러 온64 비트에서 작동하도록 복잡한 PHP 회전 함수
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 비트 VM을 실행하여 32 비트 버전의 PHP를 설치해야합니다. –
또한 일대일 비교를 수행 할 수 없다면 위의 코드가 문제인지 어떻게 알 수 있습니까? –
@OliCharlesworth : 원래 필자가 필요로했던 수정본과 관련된 Stackoverflow 질문에 기반한 교양있는 추측입니다. http://stackoverflow.com/questions/397738/32-to-64-bit-gotchas-in -php – lkessler