|
//==============================================================//
// Calculate one byte of XModem CRC //
//==============================================================//
// Этот же полином пользуется в IrDA
static void DoCRC (u8 Data, u16 &CRC) {
CRC ^= Data;
u8 i = 8;
do {
if (CRC & 0x01) { CRC >>= 1; CRC ^= 0x8408; }
else CRC >>= 1;
}while(--i);
}//То же для битового потока:
static void DoCRCBit (bool Bit, u16 &CRC) {
CRC ^= Bit;
if (CRC & 0x01) { CRC >>= 1; CRC ^= 0x8408; }
else CRC >>= 1;
}// Видимо то же, что и SM пользует, только для полинома 0x8408:
union {
unsigned Word;
struct {
unsigned char Lo;
unsigned char Hi;
};
}TxCRC;static void DoCRC (unsigned char Data) {
TxCRC.Lo ^= Data;
TxCRC.Lo ^= (TxCRC.Lo << 4);
Data = TxCRC.Lo ^ (TxCRC.Lo >> 5);
TxCRC.Lo = (Data >> 4)^(TxCRC.Lo << 3) ^ TxCRC.Hi;
TxCRC.Hi = Data;
}Ну и
/*
Common used polynoms
CCITT-32: 0x04C11DB7
CRC-16: 0x8005
CRC-CCITT: 0x1021
CRC-XMODEM: 0x8408
12bit-CRC: 0x80f
10bit-CRC: 0x233
8bit-CRC: 0x07
*/
E-mail: info@telesys.ru