大家应该都知道的,可我新手,不会vc
还不清楚谁来帮我翻译下?给点
注释的。谢谢。。static
u_short cksum(u_short *addr, int len)       
{
register int nleft = len;
register u_short *w = addr;
register u_short answer;
register int sum = 0;

while( nleft > 1 )  {
sum += *w++;   
nleft -= 2;
}

if( nleft == 1 ) {
u_short u = 0;
*(u_char *)(&u) = *(u_char *)w ;
sum += u;
}

sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
sum += (sum >> 16); /* add carry */
answer = ~sum; /* truncate to 16 bits */
return (answer);
}

解决方案 »

  1.   

    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); Result := Word(ChkSum); 
    end;
      

  2.   

    type
      PCardinal = ^Cardinal;
    function cksum(addr: PCardinal; len: integer): Cardinal;
    var
      nleft: integer;
      w: PCardinal;
      answer: cardinal;
      sum: integer;
    begin
      nleft := len;
      w := addr;
      sum := 0;  while (nleft > 1) do
      begin
        sum := sum + w^;
        Integer(w) := Integer(w) + SizeOf(Cardinal);
        nleft := nleft - 2;
      end;  if(nleft = 1) then
      begin
        sum := sum + cardinal(w^);
      end;  sum := sum shr 16 + sum and $ffff;
      sum := sum + sum shr 16;
      answer := not sum;
      result := answer;
    end;由可能错误,你测试一下。
      

  3.   

    呵呵,要什么注释?不就是算一个CheckSum么?先求和,再取和的高16为,生成一个两字节的结果。你都四个裤衩了,这段程序应该不需要注释的吧。
      

  4.   

    不好意思,我记错了,cardinal是4个字节,上面的代码应该改成:function cksum(addr: PWord; len: integer): Cardinal;
    var
      nleft: integer;
      w: PWord;
      answer: cardinal;
      sum: integer;
    begin
      nleft := len;
      w := addr;
      sum := 0;  while (nleft > 1) do
      begin
        sum := sum + w^;
        Integer(w) := Integer(w) + SizeOf(Word);
        nleft := nleft - 2;
      end;  if(nleft = 1) then
      begin
        sum := sum + Word(w^);
      end;  sum := sum shr 16 + sum and $ffff;
      sum := sum + sum shr 16;
      answer := not sum;
      result := answer;
    end;
      

  5.   

    先求和,再取和的高16为,生成一个两字节的结果。
    明白点了。
    谢谢两位的支持。
    to  yrb() :
        英雄,我崇拜你,你太负责了。
    to  cuteant()
        哈哈,我昨天还是三个哪,羡慕吧。
        可惜的就是水平比你们都烂......
    明天揭帖,就把诺贝尔非常感谢奖和诺贝尔非常高兴奖颁给两位大虾。