uchar calculateNextShiftRegister(uchar message, uchar shiftRegister) { for (int b = 0; b < 8; b++, message >>= 1) { uchar messageXor0 = (message & 1) ^ (shiftRegister & 1); uchar nextShiftRegister = (messageXor0 << 7) | // next bit 7 (((shiftRegister >> 7) & 1) << 6) | // next bit 6 ((((shiftRegister >> 6) & 1) ^ messageXor0) << 5) | // next bit 5 ((((shiftRegister >> 5) & 1) ^ messageXor0) << 4) | // next bit 4 ((((shiftRegister >> 4) & 1) ^ messageXor0) << 3) | // next bit 3 (((shiftRegister >> 3) & 1) << 2) | // next bit 2 (((shiftRegister >> 2) & 1) << 1) | // next bit 1 ((shiftRegister >> 1) & 1); // next bit 0 shiftRegister = nextShiftRegister; } return shiftRegister; } uchar calculateCRC(uchar* data) { uchar shiftRegister = 0xff; for (int i = 0; i < 23; i++) { shiftRegister = calculateNextShiftRegister(data[i], shiftRegister); } return shiftRegister; }