Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.02;
Скачать: CL | DM;

Вниз

С >> Paskal   Найти похожие ветки 

 
allucard   (2007-11-07 12:37) [0]

Помогите перевести на паскаль:

 unsigned int CountCRC16(void *mem, unsigned int len)
   {
   unsigned int a, crc16;
   char *pch;
   pch=(char *)mem;
   crc16=0;
   while(len--)
    {
    crc16^=*pch;
    a=(crc16^(crc16<<4))&0x00FF;
    crc16=(crc16>>8)^(a<<8)^(a<<3)^(a>>4);
    pch+=1;
    }
   return(crc16);
   }
добавление контрольной суммы к блоку данных в функции подготовки блока:
  unsigned int i,j;
  j=CountCRC16F(usb,i);
  memcpy(&usb[i],&j,2);


 
Palladin ©   (2007-11-07 12:42) [1]

хм... я не знаю что такое ^=
расскажи... переведу :)


 
allucard   (2007-11-07 12:45) [2]

мне похожее надо на дельфи :(


 
Palladin ©   (2007-11-07 12:53) [3]

да я мля понял что тебе надо на делфи, ты найди мне что означает символ ^


 
Правильный_Вася   (2007-11-07 12:54) [4]

небось #define стоит какой-нить


 
umbra ©   (2007-11-07 13:01) [5]

function CountCRC16(mem: Pointer, len: Word): Word;
var
  a, crc16: Word;
  pch: PChar;
begin
  pch := PChar(mem);
  crc16 := 0;
   while len - 1 > 0 do
      begin
         crc16 := crc16 xor pch^;
         a = (crc16 xor (crc16 shl 4)) & $00FF;
         crc16= (crc16 shr 8) xor (a shl 8) xor (a shl 3) xor (a shr 4);
         pch := pch + 1;
   end;
  Result := crc16;
end;


 
clickmaker ©   (2007-11-07 13:05) [6]

function CountCRC16(mem: Pointer; len: Cardinal): Cardinal;
var
 a, crc16: Cardinal;
 pch: PChar;
begin
  pch := PChar(mem);
  crc16 := 0;
  while (len > 0) do
  begin
     crc16 := crc16 xor pch^;
     a := (crc16 xor (crc16 shl 4)) and $FF;
     crc16 := (crc16 shr 8) xor (a shl 8) xor (a shl 3) xor (a shr 4);
     Inc(pch);
     Dec(len);
  end;
  result := crc16;
end;


 
allucard   (2007-11-07 13:05) [7]


> umbra ©   (07.11.07 13:01) [5]

пасиб, буду промбовать


 
Palladin ©   (2007-11-07 13:07) [8]

а что же все таки значит ^  ?
:)


 
umbra ©   (2007-11-07 13:09) [9]


> а что же все таки значит ^  ?

xor


 
Palladin ©   (2007-11-07 13:11) [10]

:) ok, запомнил


 
palva ©   (2007-11-07 13:13) [11]

а что же все таки значит ^  ?
Исключающее "или", у дельфийцев известное как XOR

Примеры перевода:

a = q^s;
a := q XOR s;

a ^= s;
a := a XOR s;


 
umbra ©   (2007-11-07 13:14) [12]

clickmaker ©   (07.11.07 13:05) [6]

> len: Cardinal


umbra ©   (07.11.07 13:01) [5]

> len: Word


Тоже хотел сначала написать Cardinal, но увидел строчку
   a=(crc16^(crc16<<4))&0x00FF;

и исправил на Word. Это имеет какое-то принципиальное значение?


 
clickmaker ©   (2007-11-07 13:15) [13]


> [12] umbra ©   (07.11.07 13:14)

ну вообще, верно. Там же crc16
я просто на автомате unsigned int => cardinal )


 
Dib@zol ©   (2007-11-07 13:45) [14]

Хм. А ить не работает! На строчку

> crc16 := crc16 xor pch^;

компилятор ругается, что мол "Operator not applicable to this operand type!"
И также непонятно, зафик здесь LEN раз повторять XOR на одном и том же результате PCH^? Может быть, тут имелось в виду нечто похожее на crc16 := crc16 xor pch[len]^ ? Пусть это не работает, но надеюсь, что мысль ясна.


 
homm ©   (2007-11-07 13:48) [15]

> [14] Dib@zol ©   (07.11.07 13:45)
> Хм. А ить не работает! На строчку
>
> > crc16 := crc16 xor pch^;

может так?
crc16 := crc16 xor DWORD(pch^);


 
Dib@zol ©   (2007-11-07 13:51) [16]

Тфу. Не обратил внимания на inc(pch). Но DWORD был определённо нужен.


 
Anatoly Podgoretsky ©   (2007-11-07 14:18) [17]


> clickmaker ©   (07.11.07 13:05) [6]
>
> > len: Cardinal
>
>
> umbra ©   (07.11.07 13:01) [5]
>
> > len: Word
>
>
> Тоже хотел сначала написать Cardinal, но увидел строчку
>    a=(crc16^(crc16<<4))&0x00FF;
>
> и исправил на Word. Это имеет какое-то принципиальное значение?
>

Серьезное, но для начала надо узнать чему равен unsigned int - это может быть разным, но вероятнее всего Cardinal


 
Anatoly Podgoretsky ©   (2007-11-07 14:24) [18]

Правда в оригинале из-за отсутствия типизации много несуразностей, там unsigned int - и указатель на буфер, и указатель на символ, и размер и промежуточные переменные, которые должны быть типа word/
То есть в одном коде замешаны Char, Word, Cardinal(dword) и все одного типа.


 
Dib@zol ©   (2007-11-07 15:29) [19]

Ещё один вариант :)

function CountCRC16(mem: Pointer; len: Cardinal): Cardinal;
asm
 PUSH ECX;

 MOV ECX, EDX; // loop counter := len;
 JECXZ @exit;  // if len = 0 then exit;

 PUSH EBX;
 PUSH ESI;
 PUSH EDI;

 MOV EBX, EAX; // EBX := mem;
 XOR EAX, EAX; // Result := 0;

 // while len > 0 do begin
 @next:
 // crc16 := crc16 xor DWORD(pch^);
 XOR AL, BYTE PTR [EBX];

 // a := (crc16 xor (crc16 shl 4)) and $FF;
 MOV EDX, EAX;
 MOV EDI, EAX;
 SHL EDI, 4;
 XOR EDX, EDI;
 AND EDX, 0FFh;

 // crc16 := (crc16 shr 8)...
 SHR EAX, 8;
 MOV ESI, EDX;
 MOV EDI, EDX;

 // ...xor(a shl 8)...
 SHL EDX, 8;
 XOR EAX, EDX;

 // ...xor(a shl 3)...
 SHL ESI, 3;
 XOR EAX, ESI;

 // ...xor(a shr 4)
 SHR EDI, 4;
 XOR EAX, EDI;

 // Inc(pch); Dec(len);
 INC EBX;

 // end;  
 LOOP @next;

 POP EDI;
 POP ESI;
 POP EBX;

 @exit:
 POP ECX;
end;



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

Текущий архив: 2007.12.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
15-1193945573
Ricks
2007-11-01 22:32
2007.12.02
В шоке от украинских новостей...


11-1178473386
Dmitry___
2007-05-06 21:43
2007.12.02
KOLProject - Build := TRUE


15-1193429784
Kostafey
2007-10-27 00:16
2007.12.02
Настройка автоматического развертывания Web-приложений в JBuilder


2-1194524361
NaRuTo
2007-11-08 15:19
2007.12.02
Как изменить цвет TMainMenu


1-1189580697
cantalia
2007-09-12 11:04
2007.12.02
Событие из DLL в Main Application