0

我目前正在开发一个将 VB6 代码转换为 PHP 的项目,我需要一些帮助。我想知道我的校验和函数的转换是否正确,因为我得到的值根本不准确。

VB6 代码:

Function CheckSum(St As String) As Long
 Dim A As Long, B As Long
 For A = 1 To Len(St)
     B = B + Asc(Mid$(St, A, 1))
 Next A
 CheckSum = B
End Function

PHP代码:

Function CheckSum($st)
{

For($a=0; $a<Count($st); $a++)
{
$B = $B + SubStr($st,$a,1);
}
return $B;
}

整个PHP代码:

Function CheckSum($st)
{

For($a=0; $a<Count($st); $a++)
{
$B = $B + SubStr($st,$a,1);
}
return $B;
}

Function DoubleChar($num)
{
$DoubleChar = Chr(IntVal($num / 256)) + Chr($num % 256);
Return $DoubleChar;
}

$host = '127.0.0.1'; 
$port = 7973; 
$waitTimeoutInSeconds = 1; 
if($fp = fsockopen($host,$port,$errCode,$errStr,$waitTimeoutInSeconds))
{   
$getplayers = DoubleChar(Chr(35)) + Chr(CheckSum(Chr(35)) * 20 % 194) + Chr(0) + Chr(35);
if(fwrite($fp, $getplayers)):
while (!feof($fp)) 
{
    $buffer = fread($fp, 256);
echo IntVal($buffer);
}   
endif;
} else {
echo "ERROR: $errno - $errstr<br />\n";
} 
fclose($fp);
4

2 回答 2

2

我想知道我的校验和转换是否正确,因为我得到的值根本不准确。

如果结果不匹配 - 则转换不正确。

于 2012-12-04T05:48:00.157 回答
1

您发布的 VisualBasicchecksum代码对字符串 st 的每个字符进行操作,并将其转换为等效的 Ansi 代码(Asc()函数)。此外,VB 代码使用该Len()函数对字符串进行操作,而您的 PHP 代码使用该count()函数对数组进行操作。

为了在 PHP 中获得等效的结果,您需要使用类似的函数,例如ord()strlen(),因此您的校验和函数看起来像:

function CheckSum($st)
{
    for($a=0; $a<strlen($st); $a++)
    {
        $B = $B + ord(substr($st,$a, 1));
    }
    return $B;
}
于 2012-12-04T06:02:18.870 回答