谁能把下面的C++转换成DelphiHEXPACKET *createHexPacket(char *pCharData) {  int nLen = 0;
  char cHex[10];
  int i = 0;
  long n = 0;
  HEXPACKET *pHexPacket = NULL;  nLen = strlen(pCharData);  pHexPacket = (HEXPACKET *) malloc( sizeof(HEXPACKET) );
  pHexPacket->data = (unsigned char *) malloc(nLen/2);
  pHexPacket->size = nLen / 3 + 1;
  memset(pHexPacket->data, 0, nLen/2);  for ( i=0; i<nLen; i+= 3) {
    memset(cHex, 0, sizeof(cHex));
    sprintf(cHex, "0x%c%c", pCharData[i], pCharData[i+1]);
    n = strtol(cHex, NULL, 16); 
    memset(pHexPacket->data+(i/3), (int)n, 1);    /* if we don't have a whitespace somethings wrong */
    if ( nLen>i+2 && pCharData[i+2] != ' ' ) {
      freeHexPacket(pHexPacket);
      return NULL;
    }  }   return pHexPacket;}

解决方案 »

  1.   

    function createHexPacket(pCharData: pchar): PHEXPACKET
    var
     nLen, i:integer;
     cHex: array[0..9] of char;
     n: int64;
     apHexPacket: PHEXPACKET;begin
    //  nLen = 0;
    //  char cHex[10];
    //  int i = 0;
    //  long n = 0;
    //  HEXPACKET *pHexPacket = NULL;  nLen := strlen(pCharData);  GetMem(pHexPacket, sizeof(HEXPACKET));
    //  pHexPacket := (HEXPACKET *) malloc( sizeof(HEXPACKET) );
      GetMem(pHexPacket^.data, nLen/2);
    //  pHexPacket->data = (unsigned char *) malloc(nLen/2);
      pHexPacket^.size := nLen div 3 + 1;  FillChar(pHexPacket^.data, nLen div 2, 0);
    //  memset(pHexPacket->data, 0, nLen/2);  for i=0 to nLen
      begin
        FillChar(cHex, sizeof(cHex), 0);
     //   memset(cHex, 0, sizeof(cHex));
      //  sprintf(cHex, "0x%c%c", pCharData[i], pCharData[i+1]);
        n := StrToInt(cHex); //strtol(cHex, NULL, 16);
    //    memset(pHexPacket->data+(i/3), (int)n, 1);
        FillChar(pHexPacket^.data + i, n, 1);   if (nLen>i+2) and (pCharData[i+2] <> ' ' ) then
       begin
          freeHexPacket(pHexPacket);
          result := nil;
          exit;
        end;  result := pHexPacket;
    end;
      

  2.   

    忘了这部分typedef struct hexPacket {
      unsigned int size;
      unsigned char *data;
    } HEXPACKET;
    佩服ing
      

  3.   

    typedef struct hexPacket {
      unsigned int size;
      unsigned char *data;
    } HEXPACKET;type HEXPACKET = record
      size: Cardinal;
      data: array of BYTE; // 其长度就是这个size 不过这样转换会复杂了点
    end;应该不需要200‘把
      

  4.   

    我觉得应该这样:type
      PHexPacket = ^THexPacket;
      THexPacket = packed record
        Size: Integer;
        Data: PChar;
      end;通货膨胀,没办法
      

  5.   

    type
      PHexPacket = ^THexPacket;
      THexPacket = packed record
        Size: Integer;
        Data: PChar;
      end;这样 也可以的 反正自己知道怎么分配空间 怎么读取 一致就可以了.
    我觉得还是C++的指针好用 或者说我对DELPHI的指针还不是很熟悉吧 哈 通货膨胀也要不了这么多吧 50’足以
      

  6.   

    FillChar(pHexPacket^.data + i, n, 1);
    出错
      

  7.   

    type
     pHexPacket=^THexPacket;
     THexPacket=packed Record  //用不用packed 看 c的pragma pack是否为1
      size:uint;
      data:PChar;
     end; function createHexPacket(pCharData:PChar):pHexPacket;
     var
         nLen :integer;
          cHex:array[0..9] of char;//不需要
             i:integer;
             n:integer;
       pPacket:pHexPacket ;
     begin
       nLen:= strlen(pCharData);
       new(pPacket);
       pPacket^.data:= AllocMem(nLen div 2); //自动清0,不必memset清
       pPacket^.size:= nLen div 3 + 1;
       i:=0;
       while i<nLen do
       begin
         fillchar(cHex,sizeof(cHex),#0);
         n:= StrToInt('$'+pCharData[i]+pCharData[i+1]);
         fillchar(pPacket^.data[i div 3],1,n);
         if ( nLen>i+2) and (pCharData[i+2] <>' ' ) then
         begin
            freeHexPacket(pPacket);
            Result:=Nil;
            exit;
         end;
         inc(i,3);
       end;
       Result:=pPacket;
    end;
      

  8.   

    接受答案,多谢诸位,再接再厉,请看
    寻C++、Delphi全能高手,200分(之二)
    http://community.csdn.net/Expert/topic/3337/3337196.xml?temp=.3753778