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

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

Ошибка в алгоритме [D7, Win95/98, WinME, WinXP]


kblc ©   (2005-09-04 19:59:00) 

Уважаемые мастера, помогите пожалуйста в поиске ошибки:
Есть три функции:

function DeCrypt(const sString: string): string;
var
 res: string;
 i, rannum: Cardinal;
begin
 if (length(GetKey)>0) and (length(sString)>0) then
 begin
   res:='';
   rannum:=0;
   for i:=1 to length(sString) do
   if (i mod 2)=0 then
      res:=res+char(ord(sString[i])-ord(GetKey[rannum])) else
      rannum:=StrToInt(sString[i]);
   Result:=res;
 end else Result:=sString;
end;

function Crypt(const sString: string): string;
var
 res: string;
 i, rannum: Cardinal;
begin
 if (length(GetKey)>0) and (length(sString)>0) then
 begin
   randomize;
   res:='';
   for i:=1 to length(sString) do
   begin
     rannum:=Random(length(GetKey))+1;
     res:=res+IntToStr(rannum);
     res:=res+char(ord(sString[i])+ord(GetKey[rannum]));
   end;
   Result:=res;
 end else Result:=sString;
end;

function GetKey: string;
var
 lpRootPathName:           array[0..MAX_PATH] of char;
 lpVolumeNameBuffer:       array[0..MAX_PATH] of char;
 lpMaximumComponentLength: Cardinal;
 lpFileSystemFlags:        Cardinal;
 lpFileSystemNameBuffer:   array[0..MAX_PATH] of char;
 lVolumeSerialNumber:      DWORD;
begin
 lpRootPathName:='C:\'#0;
 lVolumeSerialNumber:=0;

 if GetVolumeInformation(
      lpRootPathName,
      lpVolumeNameBuffer,
      sizeof(lpVolumeNameBuffer),
      @lVolumeSerialNumber,
      lpMaximumComponentLength,
      lpFileSystemFlags,
      lpFileSystemNameBuffer,
      sizeof(lpFileSystemNameBuffer)) then
    Result:=IntToStr(lVolumeSerialNumber) else
    Result:='';
end;


Проблема вот в чём:
 
 Эти функции работают-работают, а потом вдруг случается какая-то гадость:
 вот к приемру для тестирования оных я сделал так:

i:=0;
res:='фыва';
while TRUE do
begin
 inc(i);
 res:=DeCrypt(Crypt(res));
end;


 Вываливается программа при i=Randomize(Бесконечности)+1. В функции Decode происходит ошибка, программа говорит на rannum:=StrToInt(sString[i]);что sString[i] is not a valid integer value;
 Сколько просмартивал этот алгоритм - вроде бы всё верно. Бедьте добры - помогите найти ошибку.

 П.С. Функция GetKeyвсегда возвращает одно и тоже значение. Проверено.


begin...end   (2005-09-05 10:08:00) [1]

> GanibalLector ©   (05.09.05 10:04) [14]

> rannum:=StrToInt64('$'+sString[i]); // так что-ли?

Угу, хотя здесь достаточно и обычной StrToInt.


GanibalLector   (2005-09-05 10:04:00) [2]

2 begin...end ©   (05.09.05 09:58) [13]
Хм...не знал.Ну,тогда согласен.
З.Ы. rannum:=StrToInt64('$'+sString[i]); // так что-ли?


begin...end   (2005-09-05 09:58:00) [3]

> GanibalLector ©   (05.09.05 09:55) [12]

Зато вот это:

StrToInt64( '$' +'b')

работает.


GanibalLector   (2005-09-05 09:55:00) [4]

2 begin...end ©   (05.09.05 09:47) [11]
Это почему не нужно??? Нужно.
Ибо это

StrToInt64('b');

не работает.


begin...end   (2005-09-05 09:47:00) [5]

> GanibalLector ©   (05.09.05 09:45) [10]

Я о том, что свою HexToInt писать не нужно.


GanibalLector   (2005-09-05 09:45:00) [6]

2 begin...end ©   (05.09.05 09:39) [9]
>StrToInt64
Вы о чем ???


begin...end   (2005-09-05 09:39:00) [7]

> kblc

function GetKey: string;
var
 VSN: Cardinal;
begin
 if GetVolumeInformation(PChar('C:\'), nil, 0, @VSN, Cardinal(nil^), Cardinal(nil^), nil, 0) then
   Result := IntToStr(VSN)
 else
   Result := ''
end


> GanibalLector ©   (05.09.05 02:23) [7]

StrToInt64


kblc   (2005-09-05 07:36:00) [8]

Сейчас всё переделываю... после проверки сообщу о результатах!

Всем большое спасибо!


GanibalLector   (2005-09-05 02:23:00) [9]

Опс,забыл...

function HexToInt(HexStr : string) : Int64;
var RetVar : Int64;
   i : byte;
begin
 HexStr := UpperCase(HexStr);
 if HexStr[length(HexStr)] = 'H' then
    Delete(HexStr,length(HexStr),1);
 RetVar := 0;
 for i := 1 to length(HexStr) do begin
     RetVar := RetVar shl 4;
     if HexStr[i] in ['0'..'9'] then
        RetVar := RetVar + (byte(HexStr[i]) - 48)
     else
        if HexStr[i] in ['A'..'F'] then
           RetVar := RetVar + (byte(HexStr[i]) - 55)
        else begin
           Retvar := 0;
           break;
        end;
 end;
 Result := RetVar;
end;


GanibalLector   (2005-09-05 02:22:00) [10]

2  kblc ©

begin...end ©   (04.09.05 21:57) [5] как всегда прав!
Для устранения я бы сделал так :

function Crypt(const sString: string): string;
var
res: string;
i, rannum: Cardinal;
begin
if (length(GetKey)>0) and (length(sString)>0) then
begin
  randomize;
  res:='';
  for i:=1 to length(sString) do
  begin
    rannum:=Random(length(GetKey))+1;
    res:=res+IntToHex(rannum,1);
    res:=res+char(ord(sString[i])+ord(GetKey[rannum]));
  end;
  Result:=res;
end else Result:=sString;
end;

function DeCrypt(const sString: string): string;
var
res: string;
i, rannum: Cardinal;
begin
if (length(GetKey)>0) and (length(sString)>0) then
begin
  res:='';
  rannum:=0;
  for i:=1 to length(sString) do
  if (i mod 2)=0 then
     res:=res+char(ord(sString[i])-ord(GetKey[rannum])) else
      rannum:=HexToInt(sString[i]);
  Result:=res;
end else Result:=sString;
end;


begin...end   (2005-09-04 21:57:00) [11]

> kblc ©   (04.09.05 19:59)

Серийный номер тома может быть и десятизначнымдесятичным числом, вообще-то. А значит, в функции Crypt переменная rannum может быть равна 10, и её строковое представление будет составлять уже двасимвола, а не один. Со всеми вытекающими отсюда последствиями.

"Дети Ивана Кулибина" (с)


Defunct   (2005-09-04 20:54:00) [12]

> что sString[i] is not a valid integer value;

C чего вдруг ему быть Valid? Вдруг это "-" лиюл '.' либо ','
Вообще непонятно накой у тебя используется StrToInt? Может просветишь для чего оно используется?


kblc   (2005-09-04 20:50:00) [13]

Люди неспящие, помогите плз...!


kblc   (2005-09-04 20:23:00) [14]

то "-", то #14, то Ещё что-нибудь


Sam Stone   (2005-09-04 20:22:00) [15]

посмотри, чему равно sString[i], когда вылетает ошибка


Наверх

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