Вверх ↑
Ответов: 9906
Рейтинг: 351
#1: 2016-02-06 17:25:44 ЛС | профиль | цитата
Если честно, мне не удалось смекнуть, откуда ты, Леонид, сей алгоритм срисовал
По моему -- полная фигня

Я считал так:
Add(MainForm,8053393,63,119)
{
Width=425
link(onCreate,7458483:doWork1,[(382,139)])
}
Add(InlineCode,3185247,322,210)
{
@Hint=#16:Вычисление CRC-8|
WorkPoints=#5:doCRC|
EventPoints=#5:onCRC|
DataPoints=#7:DataStr|3:Pol|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Windows,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|4: |9: public|18: Pol:THI_Event;|22: DataStr:THI_Event;|20: onCRC:THI_Event;|0:|49: procedure doCRC(var _Data:TData; Index:word);|5: end;|0:|14:implementation|0:|28:procedure THiAsmClass.doCRC;|23:var _Str:string; // Код|29: i,j,_Pol,CRC,_Len: dword;|5:begin|36: _Str := ReadString(_Data,DataStr);|23: _Len := Length(_Str);|39: _Pol := ReadInteger(_Data,Pol) shl 8;|12: CRC := 0;|31: for i := 1 to _Len+1 do begin|31: CRC := CRC + byte(_Str[i]);|28: for j := 1 to 8 do begin|23: CRC := CRC shl 1;|55: if (CRC and $10000) > 0 then CRC := CRC xor _Pol;|8: end;|6: end;|32: _hi_onEvent(onCRC, CRC shr 8);|4:end;|0:|4:end.|
link(onCRC,948309:doEvent1,[])
link(DataStr,6074944:Var2,[])
link(Pol,14291107:Var2,[])
}
Add(Button,6635670,63,77)
{
Left=5
Top=80
Caption="Calc CRC"
link(onClick,12901376:doEvent1,[])
}
Add(Edit,8697974,154,28)
{
Left=80
Top=80
Width=200
Text="00 00 07 43 74 80 28"
}
Add(Label,4071037,455,210)
{
Left=295
Top=85
}
Add(Str_Enum,538753,154,84)
{
Delimiter=" "
link(onEnum,15502212:doConvert,[])
link(onEndEnum,3185247:doCRC,[(200,97)(200,216)])
link(String,8697974:Text,[])
}
Add(Hub,12901376,112,77)
{
link(onEvent1,8195036:doClear,[(137,83)(137,76)(298,76)(298,97)])
link(onEvent2,538753:doEnum,[])
}
Add(StrCat,8195036,322,84)
{
Point(doClear)
link(Str1,6074944:Var1,[(328,75)(314,75)(314,124)])
}
Add(Convertor,9339678,259,84)
{
Mode=4
link(onResult,8195036:doStrCat,[])
}
Add(GetDataEx,6074944,322,119)
{
link(Data,8195036:Result,[])
}
Add(Edit,11422416,329,147)
{
Left=95
Top=45
Text="305"
DataType=2
link(onChange,7458483:doWork2,[])
}
Add(Convertor,4337718,406,147)
{
Mode=8
link(onResult,13278715:doText,[])
link(Data,14291107:Var3,[(412,138)(398,138)(398,194)])
}
Add(Label,13278715,455,147)
{
Left=160
Top=50
}
Add(Label,9900214,406,84)
{
Height=30
Caption="10010100\r\nCRC8"
AutoSize=1
}
Add(Label,13341461,455,84)
{
Left=65
Caption="00000000000000000000011101000011011101001000000000101000"
}
Add(Convertor,2835844,406,266)
{
Mode=8
Digits=8
link(onResult,4969108:doText,[])
}
Add(Label,4969108,455,266)
{
Left=295
Top=110
}
Add(Hub,948309,371,210)
{
link(onEvent1,6450224:doConvert,[])
link(onEvent2,2835844:doConvert,[(396,223)(396,272)])
}
Add(GetDataEx,14291107,329,189)
{
link(Data,11422416:Text,[])
}
Add(HubEx,7458483,378,147)
{
link(onEvent,4337718:doConvert,[])
}
Add(Convertor,15502212,210,84)
{
Mode=5
link(onResult,9339678:doConvert,[])
}
Add(Convertor,6450224,406,210)
{
Mode=6
link(onResult,4071037:doText,[])
}
С этим online-calculator-ом сходится, вроде бы.
crc_example.png
И делался по:
Алгоритму из Букваря
Загрузим регистр нулевыми битами
Дополним хвостовую часть сообщения W нулевыми битами
While (пока еще есть необработанные биты)
  Begin
    Сдвинем регистр на 1 бит влево и поместим очередной
      еще не обработанный бит из сообщения в 0 позицию регистра.
    If (из регистра был выдвинут бит со значением "1")
      Регистр = Регистр XOR Полином
  End
Теперь в регистре содержится остаток

карма: 9

0
файлы: 1crc_example.png [33.1KB] [914]