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

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

Более оптимальный код [D7, XP]


AlexanderMS ©   (2006-04-29 19:32:00) 

Моя программа предназначена для редактирования файла определённого формата (".CSF", языковой файл игры Generals), содержащего закодированные текстовые строки следующего вида:

1я0я)я7я7яЯя7я<я/я$я

Мне удалось расшифровать файл через XOR 255 (chr(ord('1') xor 255) = 'О'):

О_п_ц_и_и_ _и_г_р_ы_

где "_" - #0  или chr(0).

Всё работает: открывает, читает, сохраняет. Но этот способ нерациональный: строк очень много, работа идёт долго.
Такие редакторы существуют, но они неудобны, да к тому же "не понимают русский язык" (Сталкивались, надеюсь: каракули вместо букв). Но они считывают и сохраняют меньше, чем за секунду!

Я не знаю лучшего способа, чем этот:

for n := 1 to u do
begin
  f.read(ch, 1);
  if ord(ch) = shift then continue;
  ch := chr(ord(ch) xor shift);
  vl := vl + ch
end;

Где
 f : tfilestream;
 vl : string; {результат, в данном примере - "Опции игры"}
 u, n : integer;
 ch : char;

 shift = 255;

Можно ли что-нибудь исправить для большего быстродействия?
Заранее спасибо.


Loginov Dmitry   (2006-04-29 22:16:00) [1]

Например:

// Максимально эффективный способ для небольших (~100 Мбайт) файлов
procedure TForm1.Button1Click(Sender: TObject);
var
 BArray: PByteArray;
 I: Integer;
begin
 with TMemoryStream.Create do
 begin
   LoadFromFile('filename');
   BArray := Memory;
   for I := 0 to Size - 1 do
   begin
     // Обрабатываешь элементы BArray, например
     // B := BArray[I];
   end;
   Free;
 end;
end;


Loginov Dmitry   (2006-04-29 21:50:00) [2]

with TMemoryStream.Create do
begin
 LoadFromFile(...);
 Seek(0, 0);
 while Position < Size do
 begin
   Read(b, 1);
   ....
 end;
 Free;
end;


В таком духе. Хотя существует гораздо более оптимальный код.


Лшдлуттнсфе   (2006-04-29 20:21:00) [3]

медленно, потому что надо отказаться от символов, и тем более от создания строки...

for n := 1 to u do
begin
 f.read(b, 1);
 if b= shift then continue;
 b := b xor shift;
 ff.write(b, 1);
end;

f, ff : tfilestream;
u, n : integer;
b : byte;


Virgo_Style   (2006-04-29 19:55:00) [4]

Попробуй TMemoryStream.


AlexanderMS   (2006-04-29 19:44:00) [5]


> Посимвольное чтение - очень медленное, читай блоками.

Я не знаю, как. Подскажите, пожалуйста.


Virgo_Style   (2006-04-29 19:41:00) [6]

Узнать лучший способ) Посимвольное чтение - очень медленное, читай блоками.


Наверх

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