该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#define POLYNOMIAL_CRC7 0x89ul
#define POLYNOMIAL_CRC16 0x11021ul
/* 计算CRC7校验码 */
static uint8_t WiFi_LowLevel_CalcCRC7(const void *data, int len)
{
const uint8_t *p = data;
int i, j;
uint16_t temp = 0;
if (len != 0)
temp = p[0] << 8;
for (i = 1; i <= len; i++)
{
if (i != len)
temp |= p[i];
for (j = 0; j < 8; j++)
{
if (temp & 0x8000)
temp ^= POLYNOMIAL_CRC7 << 8;
temp <<= 1;
}
}
return temp >> 9;
}
/* 计算CRC16校验码 */
static uint16_t WiFi_LowLevel_CalcCRC16(const void *data, int len)
{
const uint8_t *p = data;
int i, j;
uint32_t temp = 0;
if (len & 1)
{
printf("%s: data size %d is odd!\n", __FUNCTION__, len);
len--; // 不允许出现奇数长度
}
if (len != 0)
temp = (p[0] << 24) | (p[1] << 16); // 填充前二分之一
if (len > 2)
temp |= p[2] << 8; // 填充到四分之三
for (i = 3; i <= len + 2; i++)
{
if (i < len)
temp |= p[i]; // 每次都填充最后四分之一的空间
// 从左数第0~7位计算到左数第16~23位
for (j = 0; j < 8; j++)
{
if (temp & 0x80000000)
temp ^= POLYNOMIAL_CRC16 << 15;
temp <<= 1;
}
}
return temp >> 16;
}