问一个计算校验和的问题(20分)

  • 主题发起人 主题发起人 forza
  • 开始时间 开始时间
F

forza

Unregistered / Unconfirmed
GUEST, unregistred user!
看了一段IP计算校验和的程序,有一段不是很清楚,弱弱的问:
function CheckSum(var Buffer; Size: integer): Word;
type
TWordArray = array[0..1] of Word;
var
ChkSum: LongWord;
i: Integer;
begin
ChkSum := 0;
i := 0;
while Size > 1 do begin
ChkSum := ChkSum + TWordArray(Buffer);
inc(i);
Size := Size - SizeOf(Word);
end;

if Size = 1 then ChkSum := ChkSum + Byte(TWordArray(Buffer));

ChkSum := (ChkSum shr 16) + (ChkSum and $FFFF);
ChkSum := ChkSum + (Chksum shr 16);
ChkSum := ChkSum xor $FFFFFFFF;
Result := Word(ChkSum);
end;

第一个while循环应该是把首部作为一个16bit的整数数组,对这些整数求和(对吧)。
后面chksum的计算,我看是把其高16位与低16位相加(这种加的本质是什么呀,得到了什么结果?),
然后异或求其反,转化成16位的结果。

哪位能把上面程序中位的运算的实质详细说明一下呀。
 
后退
顶部