Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Вниз

CRC16/32   Найти похожие ветки 

 
Pavia ©   (2006-03-07 01:10) [0]

Контрольная сумма. Унивирсальная программа. Вот задался написанию процедуры для подсчета любого CRC.
Тип 16/32 бит
Полином
Инверсировать биты при входе
Начальное значение
XOR Конечное значение
Инверсировать биты при выходе

2 процедуры. Первая строит таблицу, другая расчитывает по ней контрольную сумму.

Почти все понятно. Но есть вопроссы. Чето я не понял, когда нужно инвертировать выходные параметры. Может у кого есть исходный код? Или подскажет как доработать данный код.

test:array [0..8] of char=("1","2","3","4","5","6","7","8","9");
 testCRC16:Word=$BB3D;
 testCRC16CCITT:Word=$29B1;
 testCRC16CCITTG:Word=$E5CC; {init=1D0F}
 testCRC32:DWord=$CBF43926;
 tabelCRC:array [0..$FF] of DWord;

procedure CreatTableCRC(bit:byte;Poly:DWord;ReflIn,ReflOut:boolean;Tabel:Pointer);
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
 i, j: Word;
 crc: DWord;
begin
if (bit=16)and (ReflIn) then   Poly:=revers16(Poly);
if (bit=32)and (ReflIn) then   Poly:=revers32(Poly);
for i := 0 to 255 do
 begin
   crc := i;
   for j := 0 to 7 do
     if (crc and 1) <> 0 then
       crc := (crc shr 1) xor Poly
     else
       crc := (crc shr 1);
  if (bit=16)and not(ReflOut) then   crc:=revers16(crc);
  if (bit=32)and not(ReflOut) then   crc:=revers32(crc);
   PTable(Tabel)[i] := crc;
 end;
end;

function GetCRC(bit:byte;p:pointer;length:integer;Tabel:Pointer;Init,XorOut:Dword):DWord;
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
crc:DWord;
i:integer;
begin
CRC:=Init;
for i:=0 to length-1 do
begin
CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor Byte(PChar(p)[i])];
end;
CRC:=CRC xor XorOut;
GetCRC:=CRC;
end;
Пример вызова.
CRC16
CreatTableCRC(16,$8005,true,true,@TabelCRC);
c3:=GetCRC(16,@Test,9,@TabelCRC,$0,$0);
CRC32
CreatTableCRC(32,$04C11DB7,true,true,@TabelCRC);
c4:=GetCRC(32,@Test,9,@TabelCRC,$FFFFFFFF,$FFFFFFFF);
CRC16CCITT сдесь собственно и загвоздка.
CreatTableCRC(16,$1021,false,false,@TabelCRC);
c1:=GetCRC(16,@Test,1,@TabelCRC,$FFFF,$0);



 
ANB ©   (2006-03-07 01:24) [1]

Стандартная функция CRC :


function CRC_CCITT(S : String) : Word;
const
CRC_CCITT_INIT = $FFFF;
CRC_POLYNOM_CCITT = $1021;
var usCRC : Word;
   ucBitIndex, C : Byte;
   i, l : Integer;
begin
l := Length(S);
usCRC := CRC_CCITT_INIT;
for i := 1 to l do begin
 C := Byte(S[i]);
 usCRC := usCRC xor Word(Word(C) shl 8);
 for ucBitIndex := 0 to 7 do begin
  if ( ( usCRC and $8000 ) <> 0 )
  then usCRC := (usCRC shl 1) xor Word(CRC_POLYNOM_CCITT)
  else usCRC := usCRC shl 1;
 end;
end;
Result := usCRC;
end;


 
Anatoly Podgoretsky ©   (2006-03-07 10:42) [2]

ANB ©   (07.03.06 01:24) [1]
Давай не будем про стандарт.


 
Desdechado ©   (2006-03-07 11:33) [3]

CRC каждый считает как хочет, его право

более стандартный - MD5


 
tesseract ©   (2006-03-07 12:14) [4]


> более стандартный - MD5

Да весело будет если с XModem будешь по MD5 работать.

Мои примеры :


{Буффер - данные start - сещение от начала буфера в байтах size - число байт от start }
function GetLCR(var buffer;start,size:word):byte;
var i:word;
 begin
{$R-}
result:=0;
for i:=start-1 to size-1 do
  result:=result+(pByteArray(@buffer)^[i]);
  result:=-result;
//   inc(result)
{$R+}
end;
{Буффер - данные start - сещение от начала буфера в байтах size - число байт от start }
{start/size  - в байтах!!!!!}
function getCRC16(var buffer;start,size:word):word;
var iByte,i:Word; B:byte;
begin
{$R-}
  Result:=$FFFF;
  For iByte:=start-1 to Size-1 do
   begin
    B:=PbyteArray(@buffer)^[iByte];
    Result:=(result and $FF00) + (B xor lo(Result));
    For i:=1 to 8 do
     begin
      if ((Result and $0001)<>0 ) then
      Result:=(Result shr 1) xor $A001
      else
      Result:=(Result shr 1)
     end;
   end;
{$R+}
end;



 
Pavia ©   (2006-03-07 17:36) [5]

Частные случаи это хорошо. Но я хочу написать общий. Похоже, что разобрался код уже почти все правильно делает. Уже считает CRC16/CRC32/CRC16CCITT_Bad/
А вот CRC16CCITT_Good не работает.
Наткунулся на одном сайте упоминание о CRC16CCITT что мол большенство программ считает не верно, там даже был пример разбора для строки "A". Оттуда и разделение на верный(Good) и не верный(Bad). На этом же сайте сказанно? что если изменить начальное значение то будет считаться так как надо. Так вот если принять Init:=1D0F; То для тестовой страки "123456789" CRC будет $E5CC. Проверяю на HexWorkshop. Он выдает то что нужно мой код нет.

Новый код

TCRC=
 record
 Init,XorOut:Dword;
 Poly:DWord;
 bit:byte;
 ReflIn,ReflOut:boolean;
 end;

function CRC(bit:byte;Poly:DWord; Init,XorOut:Dword;ReflIn,ReflOut:boolean):TCRC;
begin
Result.Init:=Init;
Result.XorOut:=XorOut;
Result.Poly:=Poly;
Result.bit:=bit;
Result.ReflIn:=ReflIn;
Result.ReflOut:=ReflOut;
end;

procedure CreatTableCRC(T:TCRC;Tabel:Pointer);
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
 i, j: Word;
 crc: DWord;
begin
if (t.bit=16) then   t.Poly:=revers16(t.Poly);
if (t.bit=32) then   t.Poly:=revers32(t.Poly);
for i := 0 to 255 do
 begin
 crc := i;
  for j := 0 to 7 do
     if (crc and 1) <> 0 then
       crc := (crc shr 1) xor t.Poly
     else
       crc := (crc shr 1);
   PTable(Tabel)[i] := crc;
 end;
end;

function GetCRC(t:TCRC;p:pointer;length:integer;Tabel:Pointer):DWord;
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
crc:DWord;
i:integer;
begin
CRC:=t.Init;
if not(t.ReflIn) then
for i:=0 to length-1 do
 CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor revers8(Byte(PChar(p)[i]))]
else
for i:=0 to length-1 do
 CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor Byte(PChar(p)[i])];
CRC:=CRC xor t.XorOut;
if (t.bit=16)and not(t.ReflOut) then   CRC:=revers16(CRC);
if (t.bit=32)and not(t.ReflOut) then   CRC:=revers32(CRC);
GetCRC:=CRC;
end;

procedure TForm1.Button1Click(Sender: TObject);
var c1,c2,c3,c4:DWord;
t:TCRC;
begin
caption:="";
t:=CRC(16,$8005,$0,$0,true,true);
CreatTableCRC(t,@TabelCRC);
c3:=GetCRC(t,@Test,9,@TabelCRC);
t:=CRC(32,$04C11DB7,$FFFFFFFF,$FFFFFFFF,true,true);
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);
if c1=TestCRC16 then caption:=caption+" CRC16=OK";
if c2=TestCRC32 then caption:=caption+" CRC32=OK";
if c3=TestCRC16 then caption:=caption+" CRC16=OK";
if c4=TestCRC32 then caption:=caption+" CRC32=OK";

t:=CRC(16,$1021,$FFFF,$0,false,false);
CreatTableCRC(t,@TabelCRC);
c3:=GetCRC(t,@Test,9,@TabelCRC);
if c3=testCRC16CCITT then caption:=caption+" CRC16CCITT=OK";

t:=CRC(16,$1021,$FFFF,$0,false,false);
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);

t:=CRC(16,$1021,$1D0F,$0,false,false); // При этих данных не работает
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);
if c4=testCRC16CCITTG then caption:=caption+" CRC16CCITTG=OK";
end;



 
Pavia ©   (2006-03-07 18:26) [6]

Все нашел ошибку УРАААААА!!!!.
Вот модуль целиком.

type
TCRC=
 record
 bit:byte;
 Poly:DWord;
 Init,XorOut:Dword;
 ReflIn,ReflOut:boolean;
 end;
var
 test:array [0..8] of char=("1","2","3","4","5","6","7","8","9");
 testCRC16:Word=$BB3D;
 testCRC16CCITT:Word=$29B1;
 testCRC16CCITTG:Word=$E5CC; {init=1D0F}
 testCRC32:DWord=$CBF43926;
 tabelCRC:array [0..$FF] of DWord;

function revers(w:DWord; j:integer):DWord;
var i:integer;
p:DWord;
begin
p:=0;
for i:=1 to j do
begin
if w and 1<>0 then   p:=(p shl 1) or 1 else p:=(p shl 1);
w:=w shr 1;
end;
revers:=p;
end;
function CRC(bit:byte;Poly:DWord; Init,XorOut:Dword;ReflIn,ReflOut:boolean):TCRC;
begin
Result.Init:=Init;
Result.XorOut:=XorOut;
Result.Poly:=Poly;
Result.bit:=bit;
Result.ReflIn:=ReflIn;
Result.ReflOut:=ReflOut;
end;

procedure CreatTableCRC(T:TCRC;Tabel:Pointer);
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
 i, j: Word;
 crc: DWord;
begin
t.Poly:=revers(t.Poly,t.bit);
for i := 0 to 255 do
 begin
 crc := i;
  for j := 0 to 7 do
     if (crc and 1) <> 0 then
       crc := (crc shr 1) xor t.Poly
     else
       crc := (crc shr 1);
   PTable(Tabel)[i] := crc;
 end;
end;

function GetCRC(t:TCRC;p:pointer;length:integer;Tabel:Pointer):DWord;
type
TTable=array [0..0] of DWord;
PTable=^TTable;
var
crc:DWord;
i:integer;
begin
CRC:=revers(t.Init,t.bit);
if not(t.ReflIn) then
for i:=0 to length-1 do
 CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor revers(Byte(PChar(p)[i]),8)]
else
for i:=0 to length-1 do
 CRC:= (CRC shr 8) xor PTable(Tabel)[byte(CRC) xor Byte(PChar(p)[i])];
CRC:=CRC xor t.XorOut;
if not(t.ReflOut) then   CRC:=revers(CRC,t.bit);
GetCRC:=CRC;
end;

procedure TForm1.Button1Click(Sender: TObject);
var c1,c2,c3,c4:DWord;
t:TCRC;
begin
caption:="";
c1:=GetCRC16(@Test,9);
c2:=GetCRC32(@Test,9);
t:=CRC(16,$8005,$0,$0,true,true);
CreatTableCRC(t,@TabelCRC);
c3:=GetCRC(t,@Test,9,@TabelCRC);
t:=CRC(32,$04C11DB7,$FFFFFFFF,$FFFFFFFF,true,true);
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);
if c1=TestCRC16 then caption:=caption+" CRC16=OK";
if c2=TestCRC32 then caption:=caption+" CRC32=OK";
if c3=TestCRC16 then caption:=caption+" CRC16=OK";
if c4=TestCRC32 then caption:=caption+" CRC32=OK";

t:=CRC(16,$1021,$FFFF,$0,false,false);
CreatTableCRC(t,@TabelCRC);
c3:=GetCRC(t,@Test,9,@TabelCRC);
if c3=testCRC16CCITT then caption:=caption+" CRC16CCITT=OK";

t:=CRC(16,$1021,$FFFF,$0,false,false);
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);

t:=CRC(16,$1021,$1D0F,$0,false,false);
CreatTableCRC(t,@TabelCRC);
c4:=GetCRC(t,@Test,9,@TabelCRC);
if c4=testCRC16CCITTG then caption:=caption+" CRC16CCITTG=OK";
end;


PS. Модераторы предыдущий пост можно стереть.


 
Pavia ©   (2006-03-07 19:36) [7]

Кому все еще интерестно нашел еще одну ошибку и оптимизировал модуль.


 
Lamer@fools.ua ©   (2006-03-07 21:24) [8]

function CalcCrc16(const AData; const ASize: LongWord; const AStartCRC: Word = 0): Word; register;
asm
               xchg    eax, edx
               xchg    eax, ecx

               test    ecx, ecx
               jz      @Exit
               test    edx, edx
               jz      @Exit
               
               push    ebx
               push    edi
               xor     ebx, ebx
               lea     edi, cs:[OFFSET @CRC16_Table]

 @Start:       mov     bl, [edx]
               xor     bl, al
               shr     ax, 8
               xor     ax, [edi + ebx * 2]
               inc     edx
               dec     ecx
               jnz     @Start
               
               pop     edi
               pop     ebx

 @Exit:        ret
               nop     // Aligning

 @CRC16_Table:
   DW      00000h, 0C0C1h, 0C181h, 00140h, 0C301h, 003C0h, 00280h, 0C241h
   DW      0C601h, 006C0h, 00780h, 0C741h, 00500h, 0C5C1h, 0C481h, 00440h
   DW      0CC01h, 00CC0h, 00D80h, 0CD41h, 00F00h, 0CFC1h, 0CE81h, 00E40h
   DW      00A00h, 0CAC1h, 0CB81h, 00B40h, 0C901h, 009C0h, 00880h, 0C841h
   DW      0D801h, 018C0h, 01980h, 0D941h, 01B00h, 0DBC1h, 0DA81h, 01A40h
   DW      01E00h, 0DEC1h, 0DF81h, 01F40h, 0DD01h, 01DC0h, 01C80h, 0DC41h
   DW      01400h, 0D4C1h, 0D581h, 01540h, 0D701h, 017C0h, 01680h, 0D641h
   DW      0D201h, 012C0h, 01380h, 0D341h, 01100h, 0D1C1h, 0D081h, 01040h
   DW      0F001h, 030C0h, 03180h, 0F141h, 03300h, 0F3C1h, 0F281h, 03240h
   DW      03600h, 0F6C1h, 0F781h, 03740h, 0F501h, 035C0h, 03480h, 0F441h
   DW      03C00h, 0FCC1h, 0FD81h, 03D40h, 0FF01h, 03FC0h, 03E80h, 0FE41h
   DW      0FA01h, 03AC0h, 03B80h, 0FB41h, 03900h, 0F9C1h, 0F881h, 03840h
   DW      02800h, 0E8C1h, 0E981h, 02940h, 0EB01h, 02BC0h, 02A80h, 0EA41h
   DW      0EE01h, 02EC0h, 02F80h, 0EF41h, 02D00h, 0EDC1h, 0EC81h, 02C40h
   DW      0E401h, 024C0h, 02580h, 0E541h, 02700h, 0E7C1h, 0E681h, 02640h
   DW      02200h, 0E2C1h, 0E381h, 02340h, 0E101h, 021C0h, 02080h, 0E041h
   DW      0A001h, 060C0h, 06180h, 0A141h, 06300h, 0A3C1h, 0A281h, 06240h
   DW      06600h, 0A6C1h, 0A781h, 06740h, 0A501h, 065C0h, 06480h, 0A441h
   DW      06C00h, 0ACC1h, 0AD81h, 06D40h, 0AF01h, 06FC0h, 06E80h, 0AE41h
   DW      0AA01h, 06AC0h, 06B80h, 0AB41h, 06900h, 0A9C1h, 0A881h, 06840h
   DW      07800h, 0B8C1h, 0B981h, 07940h, 0BB01h, 07BC0h, 07A80h, 0BA41h
   DW      0BE01h, 07EC0h, 07F80h, 0BF41h, 07D00h, 0BDC1h, 0BC81h, 07C40h
   DW      0B401h, 074C0h, 07580h, 0B541h, 07700h, 0B7C1h, 0B681h, 07640h
   DW      07200h, 0B2C1h, 0B381h, 07340h, 0B101h, 071C0h, 07080h, 0B041h
   DW      05000h, 090C1h, 09181h, 05140h, 09301h, 053C0h, 05280h, 09241h
   DW      09601h, 056C0h, 05780h, 09741h, 05500h, 095C1h, 09481h, 05440h
   DW      09C01h, 05CC0h, 05D80h, 09D41h, 05F00h, 09FC1h, 09E81h, 05E40h
   DW      05A00h, 09AC1h, 09B81h, 05B40h, 09901h, 059C0h, 05880h, 09841h
   DW      08801h, 048C0h, 04980h, 08941h, 04B00h, 08BC1h, 08A81h, 04A40h
   DW      04E00h, 08EC1h, 08F81h, 04F40h, 08D01h, 04DC0h, 04C80h, 08C41h
   DW      04400h, 084C1h, 08581h, 04540h, 08701h, 047C0h, 04680h, 08641h
   DW      08201h, 042C0h, 04380h, 08341h, 04100h, 081C1h, 08081h, 04040h
end;  // CalcCrc16


 
Lamer@fools.ua ©   (2006-03-07 21:24) [9]

function CalcCrc32(const AData; const ASize: LongWord;
 const AStartCRC: LongWord = $FFFFFFFF): LongWord; register;
asm
               xchg    eax, edx
               xchg    eax, ecx

               test    ecx, ecx
               jz      @Exit
               test    edx, edx
               jz      @Exit

               push    ebx
               push    edi
               xor     ebx, ebx
               lea     edi, cs:[OFFSET @CRC32_Table]

 @Start:       mov     bl, al
               shr     eax, 8
               xor     bl, [edx]
               xor     eax, [edi + ebx * 4]
               inc     edx
               dec     ecx
               jnz     @Start
               
               pop     edi
               pop     ebx

               
 @Exit:        not eax
               ret

               {DB      90h,  90h, 90h}         // Aligning with nop"s

 @CRC32_Table: DD      000000000h, 077073096h, 0EE0E612Ch, 0990951BAh
               DD      0076DC419h, 0706AF48Fh, 0E963A535h, 09E6495A3h
               DD      00EDB8832h, 079DCB8A4h, 0E0D5E91Eh, 097D2D988h
               DD      009B64C2Bh, 07EB17CBDh, 0E7B82D07h, 090BF1D91h
               DD      01DB71064h, 06AB020F2h, 0F3B97148h, 084BE41DEh
               DD      01ADAD47Dh, 06DDDE4EBh, 0F4D4B551h, 083D385C7h
               DD      0136C9856h, 0646BA8C0h, 0FD62F97Ah, 08A65C9ECh
               DD      014015C4Fh, 063066CD9h, 0FA0F3D63h, 08D080DF5h
               DD      03B6E20C8h, 04C69105Eh, 0D56041E4h, 0A2677172h
               DD      03C03E4D1h, 04B04D447h, 0D20D85FDh, 0A50AB56Bh
               DD      035B5A8FAh, 042B2986Ch, 0DBBBC9D6h, 0ACBCF940h
               DD      032D86CE3h, 045DF5C75h, 0DCD60DCFh, 0ABD13D59h
               DD      026D930ACh, 051DE003Ah, 0C8D75180h, 0BFD06116h
               DD      021B4F4B5h, 056B3C423h, 0CFBA9599h, 0B8BDA50Fh
               DD      02802B89Eh, 05F058808h, 0C60CD9B2h, 0B10BE924h
               DD      02F6F7C87h, 058684C11h, 0C1611DABh, 0B6662D3Dh
               DD      076DC4190h, 001DB7106h, 098D220BCh, 0EFD5102Ah
               DD      071B18589h, 006B6B51Fh, 09FBFE4A5h, 0E8B8D433h
               DD      07807C9A2h, 00F00F934h, 09609A88Eh, 0E10E9818h
               DD      07F6A0DBBh, 0086D3D2Dh, 091646C97h, 0E6635C01h
               DD      06B6B51F4h, 01C6C6162h, 0856530D8h, 0F262004Eh
               DD      06C0695EDh, 01B01A57Bh, 08208F4C1h, 0F50FC457h
               DD      065B0D9C6h, 012B7E950h, 08BBEB8EAh, 0FCB9887Ch
               DD      062DD1DDFh, 015DA2D49h, 08CD37CF3h, 0FBD44C65h
               DD      04DB26158h, 03AB551CEh, 0A3BC0074h, 0D4BB30E2h
               DD      04ADFA541h, 03DD895D7h, 0A4D1C46Dh, 0D3D6F4FBh
               DD      04369E96Ah, 0346ED9FCh, 0AD678846h, 0DA60B8D0h
               DD      044042D73h, 033031DE5h, 0AA0A4C5Fh, 0DD0D7CC9h
               DD      05005713Ch, 0270241AAh, 0BE0B1010h, 0C90C2086h
               DD      05768B525h, 0206F85B3h, 0B966D409h, 0CE61E49Fh
               DD      05EDEF90Eh, 029D9C998h, 0B0D09822h, 0C7D7A8B4h
               DD      059B33D17h, 02EB40D81h, 0B7BD5C3Bh, 0C0BA6CADh
               DD      0EDB88320h, 09ABFB3B6h, 003B6E20Ch, 074B1D29Ah
               DD      0EAD54739h, 09DD277AFh, 004DB2615h, 073DC1683h
               DD      0E3630B12h, 094643B84h, 00D6D6A3Eh, 07A6A5AA8h
               DD      0E40ECF0Bh, 09309FF9Dh, 00A00AE27h, 07D079EB1h
               DD      0F00F9344h, 08708A3D2h, 01E01F268h, 06906C2FEh
               DD      0F762575Dh, 0806567CBh, 0196C3671h, 06E6B06E7h
               DD      0FED41B76h, 089D32BE0h, 010DA7A5Ah, 067DD4ACCh
               DD      0F9B9DF6Fh, 08EBEEFF9h, 017B7BE43h, 060B08ED5h
               DD      0D6D6A3E8h, 0A1D1937Eh, 038D8C2C4h, 04FDFF252h
               DD      0D1BB67F1h, 0A6BC5767h, 03FB506DDh, 048B2364Bh
               DD      0D80D2BDAh, 0AF0A1B4Ch, 036034AF6h, 041047A60h
               DD      0DF60EFC3h, 0A867DF55h, 0316E8EEFh, 04669BE79h
               DD      0CB61B38Ch, 0BC66831Ah, 0256FD2A0h, 05268E236h
               DD      0CC0C7795h, 0BB0B4703h, 0220216B9h, 05505262Fh
               DD      0C5BA3BBEh, 0B2BD0B28h, 02BB45A92h, 05CB36A04h
               DD      0C2D7FFA7h, 0B5D0CF31h, 02CD99E8Bh, 05BDEAE1Dh
               DD      09B64C2B0h, 0EC63F226h, 0756AA39Ch, 0026D930Ah
               DD      09C0906A9h, 0EB0E363Fh, 072076785h, 005005713h
               DD      095BF4A82h, 0E2B87A14h, 07BB12BAEh, 00CB61B38h
               DD      092D28E9Bh, 0E5D5BE0Dh, 07CDCEFB7h, 00BDBDF21h
               DD      086D3D2D4h, 0F1D4E242h, 068DDB3F8h, 01FDA836Eh
               DD      081BE16CDh, 0F6B9265Bh, 06FB077E1h, 018B74777h
               DD      088085AE6h, 0FF0F6A70h, 066063BCAh, 011010B5Ch
               DD      08F659EFFh, 0F862AE69h, 0616BFFD3h, 0166CCF45h
               DD      0A00AE278h, 0D70DD2EEh, 04E048354h, 03903B3C2h
               DD      0A7672661h, 0D06016F7h, 04969474Dh, 03E6E77DBh
               DD      0AED16A4Ah, 0D9D65ADCh, 040DF0B66h, 037D83BF0h
               DD      0A9BCAE53h, 0DEBB9EC5h, 047B2CF7Fh, 030B5FFE9h
               DD      0BDBDF21Ch, 0CABAC28Ah, 053B39330h, 024B4A3A6h
               DD      0BAD03605h, 0CDD70693h, 054DE5729h, 023D967BFh
               DD      0B3667A2Eh, 0C4614AB8h, 05D681B02h, 02A6F2B94h
               DD      0B40BBE37h, 0C30C8EA1h, 05A05DF1Bh, 02D02EF8Dh
end;  // CalcCrc32


 
tesseract ©   (2006-03-07 22:43) [10]


> Частные случаи это хорошо. Но я хочу написать общий.

У меня таки как-раз не частный. Я СRС16 его использую для работы по Z/Xmodem, LCR - Весы/кассы.

> Lamer@fools.ua ©  [9]


Таблицы всегда быстрее :-) даже без Asm.


 
Pavia ©   (2006-03-07 23:06) [11]

tesseract
У тебя как раз одна из реализаций CRC, а именно CRC16 для полинома $8005. Я же добился совмещения CRC16/CRC32/CRC16CCITT и нетолько я могу задать любой полином и любые другии условия. Причем вы нигде не найдете такой код на Pascale. :)

Я строю сначала таблицу, затем по ней расчитываю. Насчет того что быстрее. Спорить не буду ASM быстрее хотя компилятр достаточно хорошо оптимизирует. Будет время перипишу на ASM.


 
tesseract ©   (2006-03-08 17:39) [12]


> У тебя как раз одна из реализаций CRC, а именно CRC16 для
> полинома $8005.

мдя ? не знал. Этот взят  с описания стандратных протоколов для модема/modbus и тд. Других вариаций не видел.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.04.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.014 c
15-1142911668
Parus
2006-03-21 06:27
2006.04.09
Тайные конференции


4-1137952300
spyrytus
2006-01-22 20:51
2006.04.09
Как заставить работать функцию из DLL "вечно".


2-1143199941
Pazitron_Brain
2006-03-24 14:32
2006.04.09
Подсветка слов в RichEdt


1-1141375130
mss
2006-03-03 11:38
2006.04.09
Как это сделать


8-1131275962
guru-guru
2005-11-06 14:19
2006.04.09
Видеокодек





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский