これはほぼ間違いなく非常にばかげた質問ですが、何らかの理由でインターネット チェックサムの計算に問題があります。すべてのアルゴリズムは、基本的に次のようになります。
WORD chksm(WORD *startpos, WORD checklen){
ulong sum = 0;
WORD answer = 0;
while (checklen > 1)
{
sum += *startpos++;
checklen -= 2;
}
if (checklen == 1)
{
*(BYTE *)(&answer) = *(BYTE *)startpos;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;}
次の行を除いて、すべて明確です。
sum += (sum >> 16);
上位 16 ビットを下位 16 ビットに追加し、上位 16 ビットをすべてゼロのままにする直前の行のように見えます。その場合、合計 >> 16 はゼロに等しくなりませんか? もしそうなら、なぜその行があるのですか?
それとも、私は(おそらく)今日、完全な精神障害を抱えているのでしょうか?