C 函数如下:
USHORT checksum(USHORT *buffer, int size) 

  unsigned long cksum=0; 
  while(size >1) 
  { 
    cksum+=*buffer++; 
    size -=sizeof(USHORT); 
  } 
  if(size ) 
  { 
    cksum += *(UCHAR*)buffer; 
  }   cksum = (cksum >> 16) + (cksum & 0xffff); 
  cksum += (cksum >>16); 
  return (USHORT)(~cksum);
}
问如何转换成 Delphi 代码谢谢了!。小弟 不知道 C 的 >> 还有 ~ 等同于 Delphi 的什么。
有人告诉我 C 的 ~  等同于 Delphi Not 可是好像不对。

解决方案 »

  1.   

    >>是右移指令,同Delphi的shr
    C++    Delphi
    >>     shr
    <<     shl
    ~      not
      

  2.   

    cksum >> 16:cksum shr 16
    cksum >>16:cksum  shr 16~ 是按位取反  如~00000000=11111111
      

  3.   

    typedef unsigned short USHORT;
    想当于 Delphi 的什么啊!
      

  4.   

    typedef unsigned char UCHAR;
    这个想当于 delphi 什么啊! 是 Byte 吗?
      

  5.   

    typedef unsigned short USHORT;
    想当于 Delphi 的什么啊!
    ----------------------------------
    相当于word.
      

  6.   

    谢谢各位我已经改完了可结果有时和 C 的一样 有时 不一样,还是有点不对 帮忙看看!
    function  checksum(buffer:PWORD;size:integer):WORD;
    var
        cksum:longword;
    begin    cksum:=0;
        cksum:=buffer^;   while size>1 do
        begin        cksum:=buffer^;
            Inc(buffer);
         //------------------
            size:=size-sizeof(SHORT);
        end;
        if size<>0 then
        begin
          cksum:=cksum+ Byte(buffer^);
        end;   cksum := (cksum shr 16) + (cksum and $FFFF);
       checksum:=  WORD(not cksum);
    end;
      

  7.   

    上边的贴的不对 完整的在这可是 还是 不行(和 C 的函数返回的不一样)!
    function  checksum(buffer:PWORD;size:integer):WORD;
    var
        cksum:longword;
    begin    cksum:=0;   while size>1 do
        begin        cksum:=buffer^;
            Inc(buffer);
         //------------------
            size:=size-sizeof(SHORT);
        end;
        if size<>0 then
        begin
          cksum:=cksum+ PByte(buffer)^;
        end;   cksum := (cksum shr 16) + (cksum and $FFFF);
       cksum := cksum+(cksum shr 16);
       checksum:=  WORD(not cksum);
    end;
      

  8.   

    大概如此吧:function checksum(buffer: PWord;size:integer): word;
    var
      cksum: Longword;
      begin
       cksum := 0;
      while (size >1) do
      begin
        cksum := cksum + buffer^;
        inc(buffer);
        size := size - sizeof(word);
      end;
      if(size > 0) then
      begin
        cksum := cksum + word(buffer^);
      end  cksum := (cksum shl 16) + (cksum and 0xffff);
      cksum := cksum + (cksum shl 16);
      result := word(not cksum);
    end;
      

  9.   

    or, 我可能用錯了 shl, 你檢查下!!! 上面的代碼應該沒錯才對吧!
      

  10.   

    // 我非常感谢各位给我的提示 可问题还是有 我全贴出来 大家帮忙看看.
    //c 代码最后返回 65208
    //--------------------------------------------------------------------
    #include <stdio.h>
    typedef unsigned short USHORT;
    typedef unsigned char UCHAR;
    USHORT checksum(USHORT *buffer, int size) 

      unsigned long cksum=0; 
      while(size >1) 
      { 
        cksum+=*buffer++; 
        size -=sizeof(USHORT); 
      } 
      if(size ) 
      { 
        cksum += *(UCHAR*)buffer; 
      }   cksum = (cksum >> 16) + (cksum & 0xffff); 
      cksum += (cksum >>16); 
      return (USHORT)(~cksum);
    }void main()
    {

    USHORT a=123;
    printf("%d\n",checksum(&a,3));
    //打印结果65208}
    //--------------------------------------------------------------------
    //Delphi 代码返回 返回 65421
    function  checksum(buffer:PWORD;size:integer):WORD;
    var
        cksum:longword;
    begin
        cksum:=0;
       while size>1 do
        begin
        
        //这里和C的结果不同.
            cksum:=cksum+buffer^;
            Inc(buffer);
         //------------------
         
            size:=size-sizeof(WORD);
        end;
        if not size=0 then
        begin
          cksum:=cksum+ PByte(buffer)^;
        end;
       cksum := (cksum shr 16) + (cksum and $FFFF);
       cksum := cksum+(cksum shr 16);
       checksum:=  WORD(not cksum);
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
     aa:WORD;
    begin
      aa:=123;
      showmessage(Format('%d',[checksum(@aa,3)]));
      //返回 65421
    end;
      

  11.   

    cksum:=cksum+buffer^;
            Inc(buffer);
    是否等同于.
    cksum+=*buffer++;
      

  12.   

    讲 Inc(buffer) 改为 Inc(buffer^) 后 返回 65228 (C 返回 65208) 还是不一样
      

  13.   

    把原来C代码中 cksum+=*buffer++; 改成 cksum+=(*buffer)++; 然后 把  Inc(buffer) 改成 Inc(buffer^) 每次返回的结果 的确一样.但是这个问题不是改 C 代码啊!还是不对啊.太谢谢各位陪我解决这个无聊的问题了!----------------------------------------------------------------------------
    还有就是我用的是 VC2003 下面代码 USHORT p=&a;
    *p++;
    printf("%d\n",*p);
    p++;
    printf("%d\n",*p);
    p++;
    printf("%d\n",*p);
    打印的结果都是一样的好像不对吧
      

  14.   

    Inc(buffer);
    修改為:
    buffer := buffer + sizeof(WORD);
    試試如何??
      

  15.   

    aiirii(ari)
    老兄再次感谢您的恢复:
    可是你的代码编译不过啊!指针可以这么用吗?
    [Error] Unit1.pas(34): Operator not applicable to this operand type
      

  16.   

    陈宽达介绍过一个把c语言转换成Pascal的工具,你找一下吧,好像在delphi深度历险网站中呢1
      

  17.   

    按我的理解,当*buffer++时,指针应该越界了,指向的内存未格式化,一般VC中未格式化的内存好像就是CC,所以测试的时候总是发现*buffer++后,*buffer的值为52428,换成十六进制为CCCC。
      

  18.   

    今天到公司又测试了一下,可以肯定的说,上面的例子是指针越界了,如果将C的代码修改一下
    USHORT a[]={123,111,222,333};
    printf("%d\n",checksum(a,3));  //65301delphi的代码修改如下:
    var
     aa:array[0..3] of  WORD;
    begin
      aa[0]:=123;
      aa[1] := 111;
      aa[2] := 222;
      aa[3] := 333;
      showmessage(Format('%d',[checksum(@aa,3)])); //65301
     end;另外, if not size=0 then这句,因为not的优先级高,所以没有进入函数体,应修改为if not(size=0) then
      

  19.   

    不好意思, 以為很簡單, 沒有測試, 經常出錯, 那最後修改一下:
    Inc(buffer, sizeof(WORD));
      

  20.   

    呵呵,Inc(buffer)这句是可以的,不是简单的加一,会根据类型发生变化的.
      

  21.   

    我 有 以 个 c to pascal 的 转换程序
    需要请联系[email protected]
      

  22.   

    >>可是你的代码编译不过啊!指针可以这么用吗?
    >>[Error] Unit1.pas(34): Operator not applicable to this operand type
    buffer := pword(integer(buffer) + sizeof(WORD));應該還是用 Inc(buffer) 啊, 要不然, 邏輯上不對, 我感覺!!!