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参数的下标应该和需要校验的数据长度一致。
标签: CRC12
![]()
分类: 软件
下一篇: C语言运算优先级
上一篇: CRC16校验的C和VB写法
|
|