vb,crc校验的程序

vb,crc校验的程序,第1张

'Text1.Text 输入数据

'Text2.Text 输出数据

Dim ReturnData(1) As Byte

Private Sub Command1_Click()

Dim CRC(2) As Byte

Dim d(6) As Byte '待传输数据

ReDim data(7) As Byte

For i = 0 To 5

data(i) = "&h" + Mid(Text1.Text, 2 * i + 1, 2)

Debug.Print data(i)

Next i

Call CRC16(data, UBound(data) - 2, data(6), data(7)) '调用CRC16计算函数

'CRC(0)为高位

'CRC(1)为低位

End Sub

Function CRC16(data() As Byte, i As Integer, ByRef ReturnDatalo As Byte, ByRef ReturnDatahi As Byte) As String

Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器

Dim CL As Byte, CH As Byte'多项式码判世虚&HA001

Dim SaveHi As Byte, SaveLo As Byte

Dim Flag As Integer

CRC16Lo = &HFF

CRC16Hi = &HFF

CL = &H1

CH = &HA0

For i = 0 To UBound(data) - 2

CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或

For Flag = 0 To 9

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

ReturnDatahi = CRC16Hi 'CRC高位

ReturnDatalo = CRC16Lo 'CRC低位

Debug.Print Hex(CRC16Lo), Hex(CRC16Hi)

Text2.Text = Text1.Text &Hex(CRC16Lo) &Hex(CRC16Hi)

End Function

long int GenerateChecksumCRC24_D32(unsigned long ulNumValues,unsigned long *pulData)

{

unsigned long i,ulData,lfsr = 0xFFFFFF

for (i= 0x0i <ulNumValuesi++)

{

ulData = pulData[i]

lfsr = CRC24_D32(lfsr,ulData)

}

return lfsr

}

static unsigned long CRC24_D32(const unsigned long old_CRC, const unsigned long Data)

{

unsigned long D [32]

unsigned long C [24]

unsigned long NewCRC [24]

unsigned long ulCRC24_D32

unsigned long int f, tmp

unsigned long int bit_mask = 0x000001

tmp = 0x000000

// Convert previous CRC value to binary.

bit_mask = 0x000001

for (f = 0f <= 23f++)

{

C[f] = (old_CRC &bit_mask) >>f

bit_mask = bit_mask <<1

}

// Convert data to binary.

bit_mask = 0x000001

for (f = 0f <= 31f++)

{

D[f] = (Data &bit_mask) >>f

bit_mask = bit_mask <<1

}

// Calculate new LFSR value.

NewCRC[0] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^

D[24] ^ D[23] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^

C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^

C[22] ^ C[23]

NewCRC[1] = D[23] ^ D[18] ^ D[0] ^ C[10] ^ C[15]

NewCRC[2] = D[24] ^ D[19] ^ D[1] ^ C[11] ^ C[16]

NewCRC[3] = D[25] ^ D[20] ^ D[2] ^ C[12] ^ C[17]

NewCRC[4] = D[26] ^ D[21] ^ D[3] ^ C[13] ^ C[18]

NewCRC[5] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[26] ^ D[25] ^ D[24] ^

D[23] ^ D[22] ^ D[17] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^ C[2] ^

C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[9] ^ C[14] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[20] ^ C[21] ^ C[22] ^

C[23]

LFSR代码示例

签名数友散是一个多项薯氏式为x24+ x23+ x6

+ x5

+x+1的24位CRC。初始值为告枯0xFFFFFF。

AN-1160

Rev. A | Page 7 of 8

NewCRC[6] = D[28] ^ D[18] ^ D[5] ^ D[0] ^ C[10] ^ C[20]

NewCRC[7] = D[29] ^ D[19] ^ D[6] ^ D[1] ^ C[11] ^ C[21]

NewCRC[8] = D[30] ^ D[20] ^ D[7] ^ D[2] ^ C[12] ^ C[22]

NewCRC[9] = D[31] ^ D[21] ^ D[8] ^ D[3] ^ C[0] ^ C[13] ^ C[23]

NewCRC[10] = D[22] ^ D[9] ^ D[4] ^ C[1] ^ C[14]

NewCRC[11] = D[23] ^ D[10] ^ D[5] ^ C[2] ^ C[15]

NewCRC[12] = D[24] ^ D[11] ^ D[6] ^ C[3] ^ C[16]

NewCRC[13] = D[25] ^ D[12] ^ D[7] ^ C[4] ^ C[17]

NewCRC[14] = D[26] ^ D[13] ^ D[8] ^ C[0] ^ C[5] ^ C[18]

NewCRC[15] = D[27] ^ D[14] ^ D[9] ^ C[1] ^ C[6] ^ C[19]

NewCRC[16] = D[28] ^ D[15] ^ D[10] ^ C[2] ^ C[7] ^ C[20]

NewCRC[17] = D[29] ^ D[16] ^ D[11] ^ C[3] ^ C[8] ^ C[21]

NewCRC[18] = D[30] ^ D[17] ^ D[12] ^ C[4] ^ C[9] ^ C[22]

NewCRC[19] = D[31] ^ D[18] ^ D[13] ^ C[5] ^ C[10] ^ C[23]

NewCRC[20] = D[19] ^ D[14] ^ C[6] ^ C[11]

NewCRC[21] = D[20] ^ D[15] ^ C[7] ^ C[12]

NewCRC[22] = D[21] ^ D[16] ^ C[8] ^ C[13]

NewCRC[23] = D[31] ^ D[30] ^ D[29] ^ D[28] ^ D[27] ^ D[26] ^ D[25] ^

D[24] ^ D[23] ^ D[22] ^ D[16] ^ D[15] ^ D[14] ^ D[13] ^

D[12] ^ D[11] ^ D[10] ^ D[9] ^ D[8] ^ D[7] ^ D[6] ^

D[5] ^ D[4] ^ D[3] ^ D[2] ^ D[1] ^ D[0] ^ C[0] ^ C[1] ^

C[2] ^ C[3] ^ C[4] ^ C[5] ^ C[6] ^ C[7] ^ C[8] ^ C[14] ^

C[15] ^ C[16] ^ C[17] ^ C[18] ^ C[19] ^ C[20] ^ C[21] ^

C[22] ^ C[23]

ulCRC24_D32 = 0

// LFSR value from binary to hex.

bit_mask = 0x000001

for (f = 0f <= 23f++)

{

ulCRC24_D32 = ulCRC24_D32 + NewCRC[f] * bit_mask

bit_mask = bit_mask <<1

}

return(ulCRC24_D32 &0x00FFFFFF)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12557576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存