CRC校验
bool check_crc(const SDPacket &packet, uint32_t len) {
uint32_t temp = 0;
uint32_t v1 = 0;
uint32_t v2 = 0;
uint32_t sum = 0;
uint8_t const *buf = reinterpret_cast<uint8_t const *>(&packet);
for (int i = 0; i < 16 - 4; i += 2) {
v1 = buf[i];
v2 = buf[i + 1];
temp = v1 | (v2 << 8);
sum += temp;
}
for (int i = 16; i < len - 1; i += 2) {
v1 = buf[i];
v2 = buf[i + 1];
temp = v1 | (v2 << 8);
sum += temp;
}
if (len % 2) {
sum += buf[len - 1];
}
v1 = sum & 0x0000ffff;
v2 = sum >> 16;
temp = v1 + v2;
v2 = temp >> 16;
if (v2 > 0) {
temp = (temp & 0x0000ffff) + v2;
}
uint32_t result = (~temp) & 0x0000ffff;
if (packet.header.checksum == result) {
return true;
}
return false;
}