2008年9月12日星期五

CRC12校验的C和VB写法

C写法:
/*=========================================================================================*/
#define uchar unsigned char
#define uint unsigned int

/*----------CRC12校验------------*/
uint CRC12(uchar* pcData,uchar len)
{
uchar cTemp,temp;
uint iCrc=0;
while(len--!=0)
{
for(cTemp=0x80; cTemp!=0; cTemp>>=1)
{
if((iCrc&0x8000)!=0)
{
iCrc<<=1; iCrc^=0x80d0; } //---余式CRC 乘以2 再求CRC ---// else { iCrc<<=1; } temp = ((*pcData)&0x7f); if((temp&cTemp)!=0) { iCrc^=0x80d0; //----再加上本位的CRC----// } } pcData++; } return(iCrc>>4);
}

VB写法:
'----------CRC12校验------------
Public Function CRC12(ByRef pcData() As Byte) As Integer

Dim str_len As Byte, FLAG As Byte
Dim cTemp As Byte, temp As Byte, tem As Byte
Dim CRCHI As Byte, CRCLO As Byte
Dim iCrc As Integer
tem = 0
CRCHI = 0
CRCLO = 0
For str_len = 1 To UBound(pcData)
DoEvents
cTemp = &H80
Do While cTemp <> 0
DoEvents
If ((CRCHI And &H80) <> 0) Then

FLAG = (CRCLO And &H80) \ &H80
CRCLO = CRCLO And &H7F
CRCLO = CRCLO * 2
CRCHI = CRCHI And &H7F
CRCHI = (CRCHI * 2) + FLAG


CRCHI = CRCHI Xor &H80
CRCLO = CRCLO Xor &HD0
'---余式CRC 乘以2 再求CRC ---
Else
FLAG = (CRCLO And &H80) \ &H80
CRCLO = CRCLO And &H7F
CRCLO = CRCLO * 2
CRCHI = CRCHI And &H7F
CRCHI = (CRCHI * 2) + FLAG



End If
temp = pcData(tem) And &H7F

If ((temp And cTemp) <> 0) Then
CRCHI = CRCHI Xor &H80
CRCLO = CRCLO Xor &HD0
'//----再加上本位的CRC----//

End If
cTemp = cTemp \ 2
Loop
tem = tem + 1
Next

FLAG = CRCHI And &HF
CRCHI = CRCHI \ 16
CRCLO = CRCLO \ 16
CRCLO = CRCLO + (FLAG * 16)
iCrc = CRCHI * 256 + CRCLO
CRC12 = iCrc
End Function
使用时,pcData参数的下标应该和需要校验的数据长度一致。
源码下载地址:
C版本:crc12.rar
VB版本:Module1.rar

没有评论: