unsigned int Checksum(void* buf, int iBufLen, CHECKSUM iType)
{
unsigned char* newbuf8;
unsigned short* newbuf16;
unsigned int sum = 0;
unsigned int checksum = 0;
switch (iType)
{
case CHK_16BIT:
{
newbuf16 = (unsigned short*)buf;
for (int i = 0; i < iBufLen; i++)
{
sum = sum + *newbuf16;
newbuf16++;
}
checksum = sum % (0xFFFF + 0x0001);
return checksum;
break;
}
case CHK_8BIT:
{
newbuf8 = (unsigned char*)buf;
for (int i = 0; i < iBufLen; i++)
{
sum = sum + *newbuf8;
newbuf8++;
}
checksum = sum % (0xFF + 0x01);
return checksum;
break;
}
default:
{
break;
}
};
}
这个是他的输出
判断一个数是8bit还是16bit?
函数中主要还是需要理解swich每个分支的处理过程,实际上呢两个处理大同小异,都是遍历求和(指针直接++可以表示数组后移),然后根据bit数取余返回。
8bit数据最大为0xff,加1取余即可获取相应8bit数据
16bit数据类似
这是一个C语言实现的校验和函数,它计算缓冲区的校验和。该函数接受三个参数:
指向缓冲区的指针(buf),
缓冲区的长度(iBufLen),
校验和类型(iType)。
校验和类型可以是CHK_16BIT或CHK_8BIT。代码然后使用switch语句根据类型执行适当的校验和计算。如果校验和类型不是CHK_16BIT或CHK_8BIT,则不执行任何操作