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

Вниз

Работа с нетипизированными файлами   Найти похожие ветки 

 
Vin_Ghost   (2003-04-16 20:38) [0]

Скажите пожалуйста, как в Delphi открыть нетипизированный файл и поменять все символы в нем от первого до последнего на свои (или оператором Xor)?
Чтобы было понятней, прилагаю аналог этой процедуры на VB:

Public Sub CodeDeCode(Fname$)
Dim CharNum%, i%
Dim SingleChar As String * 1

FileNum = FreeFile
Open Fname For Binary As #FileNum
For i = 1 To LOF(FileNum)
Get #FileNum, i, SingleChar
CharNum = Asc(SingleChar)
CharNum = CharNum Xor 241
SingleChar = Chr(CharNum)
Put #FileNum, i, SingleChar
Next i
Close #FileNum
End Sub

Если не трудно, то пришлите ответ на мой e-mail: Vin_Ghost@mail.ru


 
Babay ©   (2003-04-17 07:57) [1]

Я так понимаю что работа идет с текстовым файлом...

Var sl:TStringList;
i:Integer;
begin
Sl:=TStringList.create;
sl.LoadFromFile("имя файла ");
for i:=1 to Lendth(Sl.text) do begin
SL.Text[i]:= chr(ord(Sl.Text[i]) Xor 241);
end;
sl.savetofile("имя файла");
end;

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

если не текстовик то гдето так

открыть файл
считать в память
закрыть файл
заменить в памяти все байты как надо
записать из памяти на диск

или через файловый поток сработать

если нужен код напиши попробую сделать по свободе времени....



 
Babay ©   (2003-04-17 07:59) [2]

Да

................
sl.savetofile("имя файла");
sl.free; // добавь

end;


 
Anatoly Podgoretsky ©   (2003-04-17 08:45) [3]

Babay © (17.04.03 07:57)
Ты не правильно понимаешь, раз речь идет о XOR то ни о какйо работе с текстовым файлом и речи быть не может, просто не будет работать. Именно работа с двоичгым файлом.


 
Babay ©   (2003-04-17 08:57) [4]

To Anatoly
Человек спрашивал про замену символов (см. вопрос)
кстати а что мешает это сделать с текстовиком?
насчет двоичнорго я то же упомянул
;=)#


 
Anatoly Podgoretsky ©   (2003-04-17 09:05) [5]

И ты дал абсолютно верный по сути вопрос.
А мешают управляющие симводы в диапазоне от #0 до #31, которые получаются при использовании операции XOR, в первую очередь #0 и #26.
Поэтому надо использовать, что нибудь из следующего ряда: нетипизированный файлы, file of byte, TFileStream или WinApi функции работы с файлами.
Удобен TFileStream


 
MBo ©   (2003-04-17 09:07) [6]

> а что мешает это сделать с текстовиком?
после xor могут появится недопустимые в txt символы


 
Anatoly Podgoretsky ©   (2003-04-17 09:15) [7]

Результатом этого совета, при повторном запуске будет потеря файла!!!


 
Babay ©   (2003-04-17 09:25) [8]

Уважаемые давайте не утрировать
Файл не потеряется а просто перестанет восприниматься как текстовик. (Хотя конечно мысль возникает что при двух символах 0 он не запишется до конца)
Согласен с вами вобщемто... Сам проходил.
Просто весь вопрос в том а что там в файле лежит.
Ну и конечно для ксора надо не как текстовик обрабатывать.
Но вопрос был про замену СИМВОЛОВ (возможно я слишком близко к сердцу воспринимаю это слово)


 
Palladin ©   (2003-04-17 09:30) [9]


> Просто весь вопрос в том а что там в файле лежит.

любой файл есть бинарный


 
Anatoly Podgoretsky ©   (2003-04-17 09:33) [10]

Babay © (17.04.03 09:25)
Не упрсствуй, файл мменно потеряется, точнее снанет значительно короче. Что и означает его потерю, поскольку станет непригодным.


 
Babay ©   (2003-04-17 09:38) [11]

согласен Anatoly !!!
КОД приведенный мною для текстовика считать НЕДЕЙСТВИТЕЛЬНЫМ или моим личным глюком.. :=))#
Извиняюсь за ложный путь...


 
Slym ©   (2003-04-17 10:05) [12]

1. Не надо левых файлов...
2. Не надо много памяти...
Делай так:
//Это всевдокод - доделай сам.

hMap:=CreateFileMapping(...);//замапь файл
pChars:=Map...;//Выдели ему память
//если файл большой - мапь файл по чуть-чуть (32кб хватит)
//и работай как с памятью!!!
pChars[i]:=xor(pChars[i]);
UnMap;



 
Verg ©   (2003-04-17 10:20) [13]

На скору руку - так:

var F : file;
Buff : array[0..2047] of byte;
Rdd : integer;
I : integer;
begin
system.assign(F, <filename>);
Reset(F, 1);
try
while not Eof(F) do
begin
BlockRead(F, Buff, sizeof(Buff), Rdd);
if Rdd>0 then
begin
for I:=0 to Rdd-1 do Buff[I]:=Buff[I] xor 241;
Seek(F, FilePos(F)-Rdd);
BlockWrite(F, Buff, Rdd);
end else break;
end;
finally
system.close(F);
end;
end;


 
REA ©   (2003-04-17 10:33) [14]

Если в текстовом файле попадаются недопустимые символы (какие уже не помню), то TStringList.LoadFromFile читает файл только до этого места. Очень неприятно.



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

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

Наверх




Память: 0.5 MB
Время: 0.02 c
1-91366
Oleg1
2003-04-15 14:29
2003.04.28
Free Report 3.2


14-91505
NickBat
2003-04-10 16:32
2003.04.28
Про творчество...


6-91425
Silver_
2003-03-05 10:19
2003.04.28
DateTime с другого компа в LAN


1-91351
Andr_Volk
2003-04-16 05:43
2003.04.28
удалить из файла


14-91501
Иван Шихалев
2003-04-10 13:18
2003.04.28
Чиста про творчество :)