Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите, CRC-16 [D7]


grach ©   (2005-11-28 15:03:00) 

Пожалуйста, уважаемые, растолкуйте алгоритм вычисления имеющий следующее
описание  :

"The ROC protocol applies a cyclical redundancy check (CRC) to the message
string to produce a 16-bit remainder.
This remainder is referred to as the CRC-16 code. The CRC-16 code is
appended to the end of the message string.
The 16-bit polynomial used by the ROC is the CRC-16:
X16 + X15 + X2 + 1
The standard GPLIB CRC routine is used by the ROC. The ROC calculates CRC by
table lookup,
with the initial condition of 0000 (zeros).
An example:
                   01 02 03 01 B4 04 01 2E 00 33 D3 E4 "

искомое значение 2-а последних байта ^^^^^^.(В описании другой пример,
этот взят из логов монитора порта).
Может кто встречал эту "standard GPLIB CRC routine"  .

Алгоритм используемый Modbus даёт другое значение.

Благодарю  .
С уважением Жигайлов Роман.


PAVIA   (2005-11-29 23:16:00) [1]

Тех данных, что привел автор достаточно.

function CalcCRC16(P:PCHAR; Len:word):word;
var i,j: integer;
     t: byte;
     c: word;
begin
c:=0;
for i:=0 to len-1 do
 begin
 t:=Byte(p[i]);
 for j:=1 to 8 do
     begin
     if (t xor c) and 1=1 then
      begin
       c:=(c shr 1) xor $A001;
      end
      else
       c:=c shr 1;
      t:=t shr 1;
     end;
 end;
result:=c;
end;


PeaK   (2005-11-29 11:43:00) [2]

Контрольная сумма CRC высчитывается для того, что бы подтвердить правильность сообщения и попытаться исключить возможность его изменения. Немного работал с разными девайсами, каждая сумма рассчитывается немного по разному :-)
Мануал полный нужен... :-)


tesseract   (2005-11-29 10:07:00) [3]

Не моё.

Функция CRC16 из протокола Z/X/Y-modem.

function CalcCRC16(P:PCHAR; Len:word):word;

var iByte,i:word; B:byte;
begin
{$R-}
Result:=$FFFF;
For i:=0 to Len-1 do
begin
 b:=Byte(Pointer(LongInt(P)+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;


PeaK   (2005-11-28 17:30:00) [4]

Итак, чего-то программируется, может даже на ком-порт... :-)
А документацию что есть целиком где-нить выложить реально?


Наверх

Титульная страница Поиск, карта сайта Написать письмо