'===================================================
'模块名称:CRC_CCITT校验函数
'创建日期:2013-3-21 测试通过
'输入参数:数组Buffer
'输出参数:CRC低16位:Int(CRC16_4(Buffer,Place,L) /256)
'          CRC高16位:CRC16_4(Buffer,Place,L) Mod 256
'          Place:当前数组下标
'          L:校验数组长度
'修改记录:无
'===================================================
Public Function CRC16_4(Buffer() As Byte, Place As Integer, L As Integer) As Long
Const CRC_POLYNOM As Long = &H8408&
Const CRC_PRESET As Long = &HFFFF&
Dim CRC As Long, I As Long, J As Long
CRC = CRC_PRESET
For I = Place To Place + L - 1
    CRC = CRC Xor Buffer(I)
    For J = 0 To 7
        If (CRC And 1) Then
            CRC = (CRC \ 2) Xor CRC_POLYNOM
        Else
            CRC = (CRC \ 2)
        End If
    Next J
Next I
   CRC16_4 = (Not CRC) And &HFFFF&
End Function
用法:
如:dim data(20) as byte,从data(5)算到data(10),那么Place=5,L=6.
 
如计算A0 1C 00 02 00 21 25 32的CRC_CCITT校验是47 FA
Dim data(20) as byte
data(0)=&H7E
data(1)=&H1C
data(2)=&H1C
data(3)=&H0
data(4)=&H2
data(5)=&H0
data(6)=&H21
data(7)=&H25
data(8)=&H32
data(9)=CRC16_4(data,1,8) Mod 256   'CRC高位&H47
data(10)=Int(CRC16_4(data,1,8) /256) ‘CRC低位&HFA转换为Delphi//CRC低16位:Trunc(Int(Calu_CRC16(data)/256))
//CRC高16位:Calu_CRC16(data) mod 256
function Calu_CRC16(pData:array of Byte):LongInt;
const
    CRC_POLYNOM:LongInt=$8408;
    CRC_PRESET:LongInt=$FFFF;
var
    CRC,I,J:LongInt;
begin
    CRC:=CRC_PRESET;
    for I:=0 to Length(pData)-1 do
    begin
        CRC:=CRC xor pData[I];
        for J:=0 to 7 do
        begin
            if ((CRC And 1)=1) then
            begin
                CRC:=(CRC div 2) xor CRC_POLYNOM;
            end else
            begin
                CRC:=CRC div 2;
            end;
        end;
    end;
    Result:=(not CRC) and CRC_PRESET;
end;procedure TFrm_S_Func.btn1Click(Sender: TObject);
var
    data:array[0..8] of Byte;
begin
    data[0]:=$EE;
    data[1]:=$00;
    data[2]:=$00;
    data[3]:=$00;
    data[4]:=$00;
    data[5]:=$01;
    data[6]:=$20;
    ShowMessage(IntToStr(Calu_CRC16(data)));//正确crc=$1013,现在=$98E1
end;转换为Delphi 计算以后总是算不对,是Delphi里面长整形CRC_POLYNOM:LongInt=$8408跟vb的Const CRC_POLYNOM As Long = &H8408&转换不对?delphiCRC_CCITTvbLongInt

解决方案 »

  1.   

    是CRC校验码?如果是的话,给你一段现成,一直在用,网上找的
      

  2.   

    @wangwei244157887 谢谢,我不需要你的程序,这个是CRC-CCITT校验(你根本没仔细看我的问题),大哥CRC校验有很多种的,你的程序我不用看都知道对不上口浪费我时间,我的VB程序已经实现了在上面,只是转为Delphi程序的时候校验出来的结果不对。
      

  3.   

    结贴 自己解决了。
    procedure TFrm_S_Func.btn1Click(Sender: TObject);
    var
        data:array[0..8] of Byte;   //这里不对,应该为data:array[0..6] of Byte
    begin
        data[0]:=$EE;
        data[1]:=$00;
        data[2]:=$00;
        data[3]:=$00;
        data[4]:=$00;
        data[5]:=$01;
        data[6]:=$20;
        ShowMessage(IntToHex(Calu_CRC16(data),4));//正确crc=$1013,现在=$98E1
    end;