![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Более оптимальный код [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]Узнать лучший способ) Посимвольное чтение - очень медленное, читай блоками.