Приветствую тебя всезнающий ALL.
помогите найти реализации расчёта CRC 8, 16, 32 без использования таблиц.
собственно говоря задача чтобы размер кода был минимальным.
Заранее благодарю.
Здравствуйте, Аноним, Вы писали:
А>Приветствую тебя всезнающий ALL.
А>помогите найти реализации расчёта CRC 8, 16, 32 без использования таблиц.
А>собственно говоря задача чтобы размер кода был минимальным.
А>Заранее благодарю.
Считай, что тоже самое, что и стабицами, только побитово.
А вообще по Гугл много док в инете знает... просто у него надо спрашивать:
filetype:pdf "CRC" algorithm
или
filetype:pdf "CRC" алгоритм
еще можно упомянуть такое слово, как полиномы.
PS: а вааще считать без таблиц уж очень медленно...
CRC32:
unsigned int CRCTab(byte I)
{
unsigned int C=I;
for (int J=0;J<8;J++)
C=(C & 1) ? (C>>1)^0xEDB88320L : (C>>1);
return C;
}
unsigned int CRC(unsigned int StartCRC,const void *Addr,unsigned int Size)
{
if (CRCTab(1)==0)
InitCRC();
byte *Data=(byte *)Addr;
while (Size>0 && ((long)Data & 7))
{
StartCRC=CRCTab((byte)(StartCRC^Data[0]))^(StartCRC>>8);
Size--;
Data++;
}
while (Size>=8)
{
StartCRC^=*(unsigned int32 *)Data;
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC^=*(unsigned int32 *)(Data+4);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
StartCRC=CRCTab((byte)StartCRC)^(StartCRC>>8);
Data+=8;
Size-=8;
}
for (int I=0;I<Size;I++)
StartCRC=CRCTab((byte)(StartCRC^Data[I]))^(StartCRC>>8);
return(StartCRC);
}
... << RSDN@Home 1.2.0 alpha rev. 642>>
Минимизируем размер дальше, попутно фикся баги
:
unsigned int CRCTab(byte I)
{
for (int J=0;J<8;J++)
I=(I & 1) ? (I>>1)^0xEDB88320L : (I>>1);
return I;
}
unsigned int CRC(unsigned int StartCRC,const void *Addr,unsigned int Size)
{
byte *Data=(byte *)Addr;
for (int I=0;I<Size;I++)
StartCRC=CRCTab((byte)(StartCRC^Data[I]))^(StartCRC>>8);
return(StartCRC);
}
... << RSDN@Home 1.2.0 alpha rev. 642>>