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

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

зашился в вычислениях CRC , полистал кучу литературы, пообращался [D3]


Страницы:   1 2

aha ©   (2008-01-02 23:14:00) 

по конференциям , вернулся опять к вам . Известен полином $18F57.Есть кусок программы на С+ .Не хватает ума переделать на дельфи. Проверенная мной сумма для строки GVHGRILN, которая приводится к ввиду $0F10B257  равна $68A4.Не совсем понятен алгоритм на языке написанном С+. Может кто нибудь подскажет ?

unsigned short owenCRC16(unsigned char* packet, size_t length)
{
size_t i, j;
unsigned short crc;

assert(packet);

crc = 0;
for (i = 0; i < length; ++i)
{
 unsigned char b = packet[i];
 for (j = 0; j < 8; ++j, b 8)) & 0x80)
  {
   crc


Германн   (2008-01-04 03:15:00) [21]


> зашился в вычислениях CRC , полистал кучу литературы, пообращался
> [D3]
>
> aha   (02.01.08 23:14)
>
> по конференциям , вернулся опять к вам . Известен полином
> $18F57.

А причём тут "полином"?


icWasya   (2008-01-04 02:59:00) [22]

например, если B = $80 и crc = 0, то

выражение
(ORD(B) xor (crc shr 8)) and $80
нулю не равно


aha   (2008-01-03 21:59:00) [23]

Ничего не понимаю как ж на С+ все работает . Переделал на дельфи
таким образом

procedure TForm1.SpeedButton1Click(Sender: TObject);
         var
begin
owenCRC16('GVHGRILN',8);//хочу вычислить контр. сумму след. строки
end;

function owenCRC16(packet: pchar;  length: integer): word;
var

i,j:integer;
crc: word;
b: char;
begin
 crc:= 0;
for i:=0 to Pred(length)   do
           begin
           b:=packet[i];
         FOR J:=1 TO 8 DO
                  begin
                 if (ORD(B) xor (crc shr 8)) and $80 <>0
                 then
                 begin
                 crc:= crc shl (1);
                 crc:= crc xor ($8F57);
                 end
                 else
                 crc:= crc shl (1);
                 end;
end;
  result:= crc;
  FORM1.CAPTION:=INTTOSTR(CRC);
end;

контр. сумма должна быть $68A4, а судя по строке
                 if (ORD(B) xor (crc shr 8)) and $80 <>0 - она всегда будет равна 0 и следовательно CRC тоже
где моя ошибка ??


aha   (2008-01-03 09:24:00) [24]

спасибо  DVM
конечно надо еще перерабатывать , наверное

1.
var
i,j:integer;
//i: size_t;
//j: size_t;

2. assert(packet) не проходит у меня - никогда не пользовался функцией.

3. b:= b shl (1); b pchar не свдигается .
А в целом еще раз спасибо за уделенное внимание !!


DVM   (2008-01-02 23:34:00) [25]


> aha

вот тебе тупой автоперевод


function owenCRC16(packet: pchar;  length: size_t): word;
var
i: size_t;
j: size_t;
crc: word;
b: char;

begin
 
 
 assert(packet);
 crc:= 0;
 for{while} i:=0 to Pred(length) { ++i}
 do
 begin
   b:=packet[i];
   while{for}
   j:= 0;
   {to} j<8
   {;}
   inc(j);
   b:= b shl (1);
   do
   begin
     if (b xor (crc shr 8)) and $80
     then
     begin
       crc:= crc shl (1);
       crc:= crc xor ($8F57);
     end;
     else
     crc:= crc shl (1);
   end;
 end;
 begin
   result:= crc;
   exit;
 end;
end;


palva   (2008-01-02 23:22:00) [26]

Если программа нужна для дела, то проще не переделывать, а откомпилировать борландовским компилятором и вставить объектный файл в паскаль.
Если же вы хотите потренировать голову и пальцы, то спрашивайте, какие конструкции в программе непонятны. Здесь найдется кому ответить.


Страницы:   1 2

Наверх

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