谁能帮我看看 这段VB求CRC-16的代码为什么和下面的C语言所求的CRC不一致。

来自:    更新日期:早些时候
谁有VB CRC16校验源码~

'CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。
Function crc16(ByRef cmdstring() As Byte, ByVal j As Integer)
Dim data As Integer
Dim i As Integer

Addressreg_crc = &HFFFF
For i = 0 To j
Addressreg_crc = Addressreg_crc Xor cmdstring(i)
For j = 0 To 7
data = Addressreg_crc And &H1
If data Then
Addressreg_crc = Int(Addressreg_crc / 2)
Addressreg_crc = Addressreg_crc And &H7FFF
Addressreg_crc = Addressreg_crc Xor &HA001
Else
Addressreg_crc = Addressreg_crc / 2
Addressreg_crc = Addressreg_crc And &H7FFF
End If
Next j
Next i
If Addressreg_crc < 0 Then
Addressreg_crc = Addressreg_crc - &HFFFF0000
End If

HiByte = Addressreg_crc And &HFF
LoByte = (Addressreg_crc And &HFF00) / &H100
End Function

'调用

Call crc16(SendStr,5)
SendStr(6) = HiByte
SendStr(7) = LoByte

#define crc16_polynomial 0x8005 // crc_16校验方式的多项式.

typedef unsigned char uchar;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef enum tagboolean { false, true } bool;

ulong g_ultable[256];

// crc_16方式校验的初始化函数, 计算crc_16余数表.
void _far crc16init(void)
{
uint nremainder;
int n, m;
ulong *pultable = g_ultable;

for(n = 0; n < 256; n ++)
{
nremainder = (uint)n << 8;
for(m = 8; m > 0; m --)
{
if(nremainder & 0x8000)
{
nremainder = (nremainder << 1) ^ crc16_polynomial;
}
else
{
nremainder = (nremainder << 1);
}
}
*(pultable + n) = nremainder;
}
}

// 以crc_16方式计算一个数据块的crc值.
// pucdata - 待校验的数据块指针.
// nbytes - 数据块大小, 单位是字节.
// 返回值是无符号的长整型, 其中低16位有效.
ulong _far crc16calc(uchar *pucdata, int nbytes)
{
uint nremainder, nret;
int n;
uchar index;
ulong *pultable = g_ultable;

nremainder = 0x0000;
for(n = 0; n < nbytes; n ++)
{
index = (uchar)crcbitreflect(*(pucdata + n), 8) ^ (nremainder >> 8);
nremainder = (uint)*(pultable + index) ^ (nremainder << 8);
}
nret = (uint)crcbitreflect(nremainder, 16) ^ 0x0000;
return(nret);
}

// 反转数据的比特位, 反转后msb为1.
// 反转前: 1110100011101110 0010100111100000
// 反转后: 1111001010001110 1110001011100000
ulong _far crcbitreflect(ulong uldata, int nbits)
{
ulong ulresult = 0x00000000l;
int n;

for(n = 0; n < nbits; n ++)
{
if(uldata & 0x00000001l)
{
ulresult |= (ulong)(1l << ((nbits - 1) - n));
}
uldata = (uldata >> 1);
}
return(ulresult);
}

把c的做成dll直接调用不就行了

Function CRC16_0(data() As Byte) As Long

Dim p1 As Long
Dim datalen As Long

datalen=UBound(data)
p1=VarPtr(data(1))

CRC16_0= cal_crc(p1,datalen)

End Function

C计算CRC-16 :

unsigned int cal_crc(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned int crc_value =0;
while(len--)
{
for(i=0x80; i!=0; i>>=1 )
{
if (crc_value&0x8000)
crc_value = (crc_value << 1) ^0x8005 ;
else
crc_value = crc_value << 1 ;
if(*ptr&i)


谁能帮我看看 这段VB求CRC-16的代码为什么和下面的C语言所求的CRC不一致。视频

相关评论:

相关主题精彩

版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

Copyright © 喜物网