![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Нужно вычислить CRC строки(HEX) например : 0xE0, 0x12, 0x34, 0xFF, 0xFF
в мануале есть описание но как реализировать ето в Delphi не понимаю. Вот пример : Код:
The 16-bit crc sum calculation goes as bellow: 1) crc := 0x147A 2) for byte b = 0xE0: - crc := rl(crc) = rl(0x147A) = 0x28F4 - crc := crc xor 0xFFFF = 0x28F4 xor 0xFFFF = 0xD70B - crc := crc + crc.high + b = 0xD70B + 0xD7 + 0xE0 = 0xD8C2 3) for byte b = 0x12: - crc := rl(crc) = rl(0xD8C2) = 0xB185 - crc := crc xor 0xFFFF = 0xB185 xor 0xFFFF = 0x4E7A - crc := crc + crc.high + b = 0x4E7A + 0x4E + 0x12 = 0x4EDA 4) for byte b = 0x34: - crc := rl(crc) = rl(0x4EDA) = 0x9DB4 - crc := crc xor 0xFFFF = 0x9DB4 xor 0xFFFF = 0x624B - crc := crc + crc.high + b = 0x624B + 0x62 + 0x34 = 0x62E1 5) for byte b = 0xFF: - crc := rl(crc) = rl(0x62E1) = 0xC5C2 - crc := crc xor 0xFFFF = 0xC5C2 xor 0xFFFF = 0x3A3D - crc := crc + crc.high + b = 0x3A3D + 0x3A + 0xFF = 0x3B76 6) for byte b = 0xFF: - crc := rl(crc) = rl(0x3B76) = 0x76EC - crc := crc xor 0xFFFF = 0x76EC xor 0xFFFF = 0x8913 - crc := crc + crc.high + b = 0x8913 + 0x89 + 0xFF = 0x8A9B And the final crc sum is 0x8A9B. Допоможіть будьласка розібратися в цьому питанні. |
|
#2
|
||||
|
||||
|
Если предположить, что функция rl(x) - это сдвиг на 1 бит влево, а crc.high это старший байт слова содержащегося в crc, тогда вроде все тривиально.
|
|
#3
|
||||
|
||||
|
Цитата:
Страдалецъ Если не трудно то можно подробнее!? Извиняюсь но я не очень пока разбираюсь в такой математике. |
|
#4
|
||||
|
||||
|
Вот так будет, если мое первоначальное предположение верно:
Код:
program Project5;
{$APPTYPE CONSOLE}
uses
SysUtils;
Const
b: Array[1..5] of Byte = ($E0,$12,$34,$FF,$FF);
Var
crc: word;
i: Integer;
begin
crc := $147A;
for i := 1 to 5
do begin
crc := crc shl 1;
crc := crc xor $FFFF;
crc := crc + Hi(crc) + b[i];
end;
WriteLn(crc);
ReadLn;
end.Последний раз редактировалось Страдалецъ, 10.09.2010 в 19:05. |