BYTE TempBuf[512];
USHORT iCRC;
//声明
iCRC = ClaCRC(TempBuf, 12);
memcpy(TempBuf+12, &iCRC, 2);
//调用unsigned short int ClaCRC(BYTE* lpBuf,int DataLen)
{
unsigned short int CRC_Code = 0;
BOOL IsHI;
int i;
DataLen += 2;
for(;DataLen > 0;DataLen --) 
        {
for(i = 0x80; i != 0; i >>= 1) 
                {
if((CRC_Code & 0x8000) > 0)
{
IsHI = TRUE;
}
else
{
IsHI = FALSE;
}
CRC_Code <<= 1;
if((DataLen > 2) && ((*lpBuf & i) == i))
CRC_Code |= 0x0001;
if(IsHI)
CRC_Code ^= 0x1021;
}
lpBuf++;
}
return(CRC_Code);
}上面的VC代码在Delphi中该怎么表示呀
 请求各位帮帮忙,不胜感激!

解决方案 »

  1.   

    TempBuf: Array [0..512-1] of BYTE;
    iCRC: BYTE;
    //声明
    iCRC := ClaCRC(TempBuf, 12);
    Move(iCRC, TempBuf[12], 2);
    //调用function ClaCRC(lpBuf: PBYTE; DataLen: INteger):BYTE;
    var
    CRC_Code : BYTE;//= 0;
    IsHI: BOOL;
    i: Integer;
    begin
      CRC_CODE := 0;
      Inc(DataLen, 2); for DataLen := DataLen to 1 do 
            begin
     i := $80;
              while (i<> 0 ) do//i = 0x80; i != 0; i >>= 1) 
              begin      
    if((CRC_Code and $8000) > 0)then
    begin
    IsHI := TRUE;
    end
    else
    begin
    IsHI := FALSE;
    end
    CRC_Code := CRC_Code shl 1;//<<= 1;
    if((DataLen > 2) and ((lpBuf^ and i) = i))then
    CRC_Code := CRC_Code or $0001;
    if(IsHI)then
    CRC_Code := CRC_COde xor $1021;//^= 0x1021;
    end;
    Inc(lpBuf);
                       i := i shr 1; 
    end;
    result :=CRC_Code;
    end;
      

  2.   

    function TFCOMM.claCRC(lpbut:array of byte;DataLen:integer):word;
    var
      IsHi:boolean;
      i:integer;
      CRC_code:word;
      p:^byte;
    begin
       p:=@lpbut[1];
       CRC_code:=0;
       for DataLen:=DataLen+2 downto 1 do
       begin
          i:=$80;
          while (i<>0) do
          begin
             if((CRC_code and $8000)>0) then
                IsHi:=True
             else
                IsHi:=False;
             CRC_code:=CRC_code shl 1;
             if((DataLen>2) and ((p^ and i)=i)) then
                CRC_code:=CRC_code or $0001;
             if(IsHi) then
                CRC_code:=CRC_code xor $1021;
             i:=i shr 1;
          end;
          inc(p);
       end;   Result:=CRC_code;
    end;这是我自已改的。可以编译运行的,帮忙看看意思有没有变动。
    感谢大家的关注和回复。
    楼上的谢谢你,不过你的代码我在编译时有问题。可能是我调用的方式和你不同吧。
    CRCValue:=Fcomm.claCRC(sbuf,10); 我的调用是这样弄的,是不是和你的有区别,还烦请告之!
      

  3.   

    还有一段代码想和大家交流一下,顺便问一句怎么加分和给分呀?不胜感激!
    //声明
    BYTE DataBuf[512];
    BYTE TempBuf[512];
    int DataLen,TempLen;
    //调用
    TorF=AssicDeComp((char*)DataBuf,&DataLen,TempBuf,TempLen);BOOL AssicDeComp(char* lpDest, int* lpDestLen, BYTE* lpSour, int SourLen)
    {
    int i, iTemp;
    BYTE cTemp;
    if((SourLen * 2) > *lpDestLen) return(FALSE);
    iTemp = 0;          //whb *lpDestLen=512;
    for(i = 0; i < SourLen; i++)
    {
    cTemp = *(lpSour + i);
    cTemp >>= 4;
    if(cTemp >= 0x0A)   //高位
    {
    *(lpDest + iTemp) = cTemp + 0x37;
    }
    else
    {
    *(lpDest + iTemp) = cTemp + 0x30;
    }
    iTemp++;
    cTemp = *(lpSour + i);
    cTemp &= 0x0F;     //低位
    if(cTemp >= 0x0A)
    {
    *(lpDest + iTemp) = cTemp + 0x37;
    }
    else
    {
    *(lpDest + iTemp) = cTemp + 0x30;
    }
    iTemp++;
    }
    *(lpDest + iTemp) = NULL;
    *lpDestLen = iTemp;
    return(TRUE);
    }
      

  4.   

    CRCValue:=Fcomm.claCRC(sbuf,10); 我的调用是这样弄的,是不是和你的有区别,还烦请告之!看你的sbuf是怎么声明的了
    如果是array of byte就按你的来吧我是按照原型ClaCRC(BYTE* lpBuf,int DataLen)来声明的TempBuf: Array [0..512-1] of BYTE;
    不过调用的时候写错了:
    iCRC := ClaCRC(TempBuf, 12);
    应该是:
    iCRC := ClaCRC(@TempBuf[0], 12);
      

  5.   

    To:soft8848(菜鸟)
       感谢您的回复,和您说的意思是一样的。
       能麻烦您帮忙转换一下上面的哪段VC代码吗,我转换之后感觉是错误的,功能和上面的不一样。
       再次表示感谢!