Форум: "Начинающим";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
ВнизБолее оптимальный код Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.014 c