Форум: "Начинающим";
Текущий архив: 2007.12.02;
Скачать: [xml.tar.bz2];
ВнизС >> 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.048 c