CRC 8,16,32 без таблиц.
От: Аноним  
Дата: 02.02.06 13:53
Оценка:
Приветствую тебя всезнающий ALL.

помогите найти реализации расчёта CRC 8, 16, 32 без использования таблиц.
собственно говоря задача чтобы размер кода был минимальным.

Заранее благодарю.
Re: CRC 8,16,32 без таблиц.
От: Plague Россия 177230800
Дата: 02.02.06 14:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Приветствую тебя всезнающий ALL.


А>помогите найти реализации расчёта CRC 8, 16, 32 без использования таблиц.

А>собственно говоря задача чтобы размер кода был минимальным.

А>Заранее благодарю.


Считай, что тоже самое, что и стабицами, только побитово.
А вообще по Гугл много док в инете знает... просто у него надо спрашивать:

filetype:pdf "CRC" algorithm

или

filetype:pdf "CRC" алгоритм

еще можно упомянуть такое слово, как полиномы.

PS: а вааще считать без таблиц уж очень медленно...
Re: CRC 8,16,32 без таблиц.
От: marat321  
Дата: 02.02.06 14:28
Оценка:
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>>
Re[2]: CRC 8,16,32 без таблиц.
От: marat321  
Дата: 02.02.06 14:36
Оценка:
Минимизируем размер дальше, попутно фикся баги :
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>>
Re: CRC 8,16,32 без таблиц.
От: AntZ  
Дата: 03.02.06 08:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Приветствую тебя всезнающий ALL.


А>помогите найти реализации расчёта CRC 8, 16, 32 без использования таблиц.

А>собственно говоря задача чтобы размер кода был минимальным.

СRC16, из боевого проекта

; uint16 Crc16(int16 *p, int16 count)
; {
; uint16 crc = 0;
; int16 i;
; while (--count >= 0)
; {
; crc = crc ^ (uint16) *p++;
; i = 16;
; do {
; if (crc & 0x8000)
; crc = crc << 1 ^ 0x1021;
; else
; crc = crc << 1;
; } while (--i);
; }
; return (crc);
; }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.