Перестали работать процедуры кодировки в Delphi 2010

StudInst
Дата: 13.05.2011 18:17:12
В 7-й Delphi всё работало без ошибок:
const
  csCryptFirst = 20;
  csCryptSecond = 230;
  csCryptHeader = 'Crypted';

function TForm.CryptString(Str: String): String;
var I: Integer;
    Clen: Integer;
begin
 if Str = ''
 then begin
  Exit;
  Result := '';
 end;
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)+clen);
 Move(csCryptHeader[1], Result[1], clen);
 For i := 1 to Length(Str) do
 begin
  if i mod 2 = 0
   then Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)
   else Result[i+clen] := Chr(Ord(Str[i]) xor csCryptSecond);
 end;
end;

function TForm.UnCryptString(Str: String): String;
var I: Integer;
    Clen: Integer;
begin
 Result := '';
 if Str ='' then Exit;
 Clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)-Clen);
 ShowMessage(Copy(Str, 1, clen));
 If Copy(Str, 1, clen) <> csCryptHeader then
  raise ECryptError.Create('Файл поврежден!');
 For i := 1 to Length(Str)-clen do
 begin
  if (i) mod 2 = 0
   then Result[i] := Chr(Ord(Str[i+clen]) xor csCryptFirst)
   else Result[i] := Chr(Ord(Str[i+clen]) xor csCryptSecond);
 end;
end;
А теперь шифруется информация некорректно - контрольное слово 'Crypted' постоянно обрезается. Ясно, что ошибка связана с переходом на юникод... но все попытки решить проблему самостоятельно не увенчались успехом.
Очень нужна помощь в решении данной проблемы!
fd00ch
Дата: 13.05.2011 19:02:02
StudInst, на Move() обрати внимание
StudInst
Дата: 13.05.2011 19:36:49
fd00ch, спасибо! первая проблема решена!

Теперь "Crypted" сохраняется и читается нормально, но вот текст восстанавливается в виде "крокозябриков". Что ещё в коде требует изменений?
Ega
Дата: 13.05.2011 20:07:30
StudInst
fd00ch, спасибо! первая проблема решена!

Теперь "Crypted" сохраняется и читается нормально, но вот текст восстанавливается в виде "крокозябриков". Что ещё в коде требует изменений?


const
  csCryptFirst = 20;
  csCryptSecond = 230;
  csCryptHeader: AnsiString = 'Crypted';

function TForm.CryptString(Str: AnsiString): AnsiString;
var I: Integer;
    Clen: Integer;
begin
 if Str = '' then Exit('');
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)+clen);
 Move(csCryptHeader[1], Result[1], clen);
 For i := 1 to Length(Str) do
 begin
  if i mod 2 = 0
   then Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)
   else Result[i+clen] := Chr(Ord(Str[i]) xor csCryptSecond);
 end;
end;

function TForm.UnCryptString(Str: AnsiString): AnsiString;
var I: Integer;
    Clen: Integer;
begin
 if Str ='' then Exit('');
 Clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)-Clen);
 ShowMessage(Copy(Str, 1, clen));
 If Copy(Str, 1, clen) <> csCryptHeader then
  raise ECryptError.Create('Файл поврежден!');
 For i := 1 to Length(Str)-clen do
 begin
  if (i) mod 2 = 0
   then Result[i] := Chr(Ord(Str[i+clen]) xor csCryptFirst)
   else Result[i] := Chr(Ord(Str[i+clen]) xor csCryptSecond);
 end;
end;

Вроде так
fd00ch
Дата: 13.05.2011 20:14:40
Ну и про Odd() нелишним будет узнать :-)
StudInst
Дата: 13.05.2011 20:22:44
Ega, не-е... - я так пробовал )))
"[DCC Error] Unit.pas: E2010 Incompatible types: 'AnsiChar' and 'Char'"
Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)

fd00ch
Ну и про Odd() нелишним будет узнать :-)
Ord? Аргументы - AnsiChar, Char, WideChar... По логике с Str[i] всё должно работать... Может подскажите поточнее?
Ega
Дата: 13.05.2011 20:26:54
StudInst
Ega, не-е... - я так пробовал )))
"[DCC Error] Unit.pas: E2010 Incompatible types: 'AnsiChar' and 'Char'"
Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)


А если подумать чуть-чуть?
Result[i+clen] := AnsiChar(Ord(Str[i]) xor csCryptFirst)
StudInst
Дата: 13.05.2011 20:38:30
Ega, да, благодарю! Всё работает!
А "отюникодить" Chr(Ord(Str[i]) никак не получится? Уж коли везде по умолчанию Юникод - может и этот код как-то получится доработать на будущее?

fd00ch , на счёт Odd тоже понял - спасибо!
Ega
Дата: 13.05.2011 20:41:29
StudInst
А "отюникодить" Chr(Ord(Str[i]) никак не получится? Уж коли везде по умолчанию Юникод - может и этот код как-то получится доработать на будущее?


Можно. Вообще уходи от Char, используй Byte. Выделил память под строку - и вперёд, каждый байт крути по своему алгоритму.
StudInst
Дата: 13.05.2011 20:45:58
Ega,
понял, спасибо! Надо будет попробовать на досуге.