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

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

С >> Paskal [D7, XP]


allucard ©   (2007-11-07 12:37:00) 

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

 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^(crc168)^(a


Dib@zol   (2007-11-07 15:29:00) [1]

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

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;


Anatoly Podgoretsky   (2007-11-07 14:24:00) [2]

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


Anatoly Podgoretsky   (2007-11-07 14:18:00) [3]


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

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


Dib@zol   (2007-11-07 13:51:00) [4]

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


homm   (2007-11-07 13:48:00) [5]

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

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


Dib@zol   (2007-11-07 13:45:00) [6]

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

> crc16 := crc16 xor pch^;

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


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


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

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


umbra   (2007-11-07 13:14:00) [8]

clickmaker ©   (07.11.07 13:05) [6]

> len: Cardinal


umbra ©   (07.11.07 13:01) [5]

> len: Word


Тоже хотел сначала написать Cardinal, но увидел строчку
    a=(crc16^(crc16


palva   (2007-11-07 13:13:00) [9]

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

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

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

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


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

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


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


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

xor


Palladin   (2007-11-07 13:07:00) [12]

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


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


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

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


clickmaker   (2007-11-07 13:05:00) [14]

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;


umbra   (2007-11-07 13:01:00) [15]

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;


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

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


Palladin   (2007-11-07 12:53:00) [17]

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


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

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


Palladin   (2007-11-07 12:42:00) [19]

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


Наверх

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