Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.043 c
15-1194281177
Slider007
2007-11-05 19:46
2007.12.02
С днем рождения ! 5 ноября 2007 понедельник


15-1193496195
inside_out
2007-10-27 18:43
2007.12.02
Реализация сети Кохоннена в Дельфи


2-1194595850
pathfinder
2007-11-09 11:10
2007.12.02
EExternalException..


15-1193719649
Separator
2007-10-30 07:47
2007.12.02
Распознование баркодов


15-1193836277
фыва
2007-10-31 16:11
2007.12.02
Как убрать фон вокруг названия ярлыков на рабочем столе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский