Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

Более оптимальный код   Найти похожие ветки 

 
AlexanderMS ©   (2006-04-29 19:32) [0]

Моя программа предназначена для редактирования файла определённого формата (".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;

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


 
Virgo_Style ©   (2006-04-29 19:41) [1]

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


 
AlexanderMS ©   (2006-04-29 19:44) [2]


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

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


 
Virgo_Style ©   (2006-04-29 19:55) [3]

Попробуй TMemoryStream.


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

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

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;


 
Loginov Dmitry ©   (2006-04-29 21:50) [5]

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


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


 
Loginov Dmitry ©   (2006-04-29 22:16) [6]

Например:

// Максимально эффективный способ для небольших (~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;



Страницы: 1 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.03 c
2-1146317725
Silica
2006-04-29 17:35
2006.05.21
Код ANSI


2-1146537399
konrads
2006-05-02 06:36
2006.05.21
Требования программ Delphi for .NET к компьютеру


15-1145556097
Катерина
2006-04-20 22:01
2006.05.21
Очченно отвлеченная тема: Фото в Аське


2-1146245403
Mark86rus
2006-04-28 21:30
2006.05.21
как в строке отрезать последние три символа?


2-1146745006
olevacho_
2006-05-04 16:16
2006.05.21
формат данных для TiDHTTP.POST