/*********************
Get CRC
*********************/
Unsigned short get_crc(buffer,count)
Unsigned char * buffer;
Int count;
{
Unsigned short code;
Unsigned short crc;
/*********************
Get CRC
*********************/
Public Function get_crc(buffer as Byte(),count as Long) as Long ' unsigned short get_crc(buffer,count)
' unsigned char * buffer;
' int count;
Dim i As Long ' {
Dim code As Long ' unsigned short code;
Dim crc As Long ' unsigned short crc;
i=0 '
crc=0 ' crc=0;
Do ' while (count--)
count=count-1:If count=0 Then Exit Do ' {
code=crc\256 mod 256 ' code=(crc>>8) & 0xff;
code=code xor buffer(i):i=i+1 ' code^=(*buffer ++ & 0xff);
'
code=code xor (code\64) ' code^=code >> 4;
crc=crc*256 ' crc << = 8;
crc=crc xor code ' crc^=code;
crc=crc*32 ' crc << =5;
crc=crc xor code ' crc^=code;
crc=crc*128 ' crc << =7;
crc=crc xor code ' crc^=code;
Loop ' }
get_crc=crc ' return crc;
End Function ' }
Public Function CRC16(data() As Byte) As String
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC暫存器
Dim CL As Byte, CH As Byte '多項式碼&HA001
Dim CRCLo As String, CRCHi As String
Dim SaveHi As Byte, SaveLo As Byte
Dim I As Integer
Dim Flag As Integer
CRC16Lo = &HFF
CRC16Hi = &HFF
CL = &H1
CH = &HA0
For I = 0 To UBound(data)
CRC16Lo = CRC16Lo Xor data(I) '每一個資料與CRC暫存器進行異或
For Flag = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果高位位元組最后一位為1
CRC16Lo = CRC16Lo Or &H80 '否則低位位元組右移后前面補1
End If '否則自動補0
If ((SaveLo And &H1) = &H1) Then '如果LSB為1,則與多項式碼進行異或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next Flag
Next I
If Len(Hex(CRC16Hi)) = 1 Then
CRCHi = "0" + Hex(CRC16Hi)
Else
CRCHi = Hex(CRC16Hi)
End If
If Len(Hex(CRC16Lo)) = 1 Then
CRCLo = "0" + Hex(CRC16Lo)
Else
CRCLo = Hex(CRC16Lo)
End If
CRC16 = CRCLo + CRCHi
End Function