Главная страница
    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.045 c
15-1193135552
Fregl
2007-10-23 14:32
2007.12.02
Отображение графиков в реальном времени


2-1194476091
TankMan
2007-11-08 01:54
2007.12.02
Подскажите пожалуйста почему выдается ошибка в TidFTP?


3-1184772562
olevacho_
2007-07-18 19:29
2007.12.02
защта базы.


15-1193574821
DeadMeat
2007-10-28 15:33
2007.12.02
Опять про *.bpl


3-1184680236
BlackCat
2007-07-17 17:50
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский