Даллосовская CRC
Нужен алгоритм вычисления даллосовской CRC. Может у кого завалялся или есть реализация?
Николай.
Hi!
Нужен алгоритм вычисления даллосовской CRC. Может у кого завалялся или есть реализация?
Николай.
//------------------------------------------------
byte __fastcall CRC8(int nByte, byte Bytes[])
{
byte CrcVal = 0; // Величина CRC
byte ByteVal; // Текущий байт
bool BitIn; // Текущий бит
for (int i=0; i<nByte; i++) // По всем байтам
{
ByteVal = Bytes; // Текущий байт
for (int j=0; j<8; j++) // По всем битам
{
BitIn = (ByteVal^CrcVal) & 0x01;
if (BitIn) CrcVal ^= 0x18; // XOR-маска
CrcVal >>= 1; // Сдвигаем CRC
if (BitIn) CrcVal += 0x80; // Вдвиг тек бит
ByteVal >>= 1; // Сдвиг тек байт
};
};
return CrcVal; // Возращаем CRC
}
//------------------------------------------------
WORD __fastcall CRC16(int nByte, byte Bytes[])
{
WORD CrcVal = 0; // Величина CRC
WORD ByteVal; // Текущий байт
bool BitIn; // Текущий бит
for (int i=0; i<nByte; i++) // По всем байтам
{
ByteVal = Bytes; // Текущий байт
for (int j=0; j<8; j++) // По всем битам
{
BitIn = (ByteVal^CrcVal) & 0x01;
if (BitIn) CrcVal ^= 0x4002;// XOR-маска CrcVal >>= 1; // Сдвигаем CRC
if (BitIn) CrcVal += 0x8000;// Вдвиг тек бит
ByteVal >>= 1; // Сдвиг тек байт
};
};
CrcVal = ~CrcVal; // Инвертируем CRC
return CrcVal; // Возращаем CRC
}
//------------------------------------------------
Вроде работало. А вообще по CRC можно посмотреть в любом описании 1Wire устройства (качаются с даллосовского сайта)