![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
С >> 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]хм... я не знаю что такое ^=
расскажи... переведу :)