![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ANSI код символа EOF
leonidus © (2005-10-06 14:01:00)Люди подскажите пожалуйста ANSI код символа EOF. Дело в том, что в результате кодирования тектового файла путем изменения ANSI кодов каждого символа в соответсвии с ключом кодирования где-то в середине файла появляется знак EOF и потом при чтении этого файла программа на этот моменте "запинается" т.е. считает что файл уже весь считан, хотя это не так. Как мне узнать код символа EOF, что бы еще на этапе кодирования если такой символ получается просто заменять его на безобидный символ?
leonidus (2005-10-06 22:10:00) [1]Я прочел нормально файл из потока:
FS := TFileStream.create(...);
try
SetLength(Str, FS.Size);
FS.Read(Pointer(Str)^, Length(str));
finally
FS.Free
end;
clickmaker (2005-10-06 17:02:00) [2]
> leonidus © (06.10.05 16:07) [18]
потому что, если у тебя не unicode, то код символа должен быть от 0 до 255 - 1 байт то бишь
Anatoly Podgoretsky (2005-10-06 16:48:00) [3]leonidus © (06.10.05 15:14) [17]
ЗИП не подходит - это точно такой же двоичный формат, нужна транспортная упаковка, например HEX ил Base64, UUE
leonidus (2005-10-06 16:07:00) [4]>clickmaker а почему символы больше 255 исключать? дело в том что у меня при суммировании: kod:=ord(st[i])+ord(key[n]); kod как правило больше 255 получается....
leonidus (2005-10-06 15:14:00) [5]что значит упаковать, zip`ом?
Anatoly Podgoretsky (2005-10-06 14:56:00) [6]leonidus © (06.10.05 14:01)
Ошибка в постановке, у тебя не текстовый файл соответвтвенно с ним надо работать как с двоичным.
leonidus © (06.10.05 14:39) [14]
Нельзя работать с закодированным файлом как с текстовым, в нем все коды от 0 до 255, надо его упаковывать, тогда пойдут и методы работы с текстовыми файлами.
clickmaker (2005-10-06 14:44:00) [7]ну для начала я бы писал так
if (kod = 0) or (kod > 255) then
st[i] := '_'
VCL при чтении файла не юзает никаких EOF, кроме реального конца файла. Можешь убедиться, открыв исходники и проследив TStrings.ReadFromFile -> ReadFromStream -> TFileStream.Read -> FileRead -> ReadFile. Последний - АПИшный вызов, ему на все символы, включая EOF и пр. глубоко фиолетово, он читает файл как есть
Трабла скорей всего в стринглисте
leonidus (2005-10-06 14:39:00) [8]может есть более протые и быстрые методы кодирования текстовых файлов? тут критично не время шифромания, а время дешифрования, т.е. файл шифруется один раз а расшифровывается в программе довольно часто
leonidus (2005-10-06 14:37:00) [9]>clickmaker да нет вроде символов с кодом 0 нет. Я кодирую так:
const
key='abc'
...
...
begin
//читаем не кодированный текстовый файл помещая его в одну строчку
st:=''
for i:=0 to f.Count-1 do
st:=st+f.Strings[i];
//шифруем его
n:=0;
for i:=1 to length(st) do
begin
inc(n);
if n>length(key) then n:=1;
kod:=ord(st[i])+ord(key[n]);
if kod=0 then
st[i]:='_'
else
st[i]:=chr(kod);
end;
и где может быть трабла?
Leonid Troyanovsky (2005-10-06 14:33:00) [10]
> Leonid Troyanovsky © (06.10.05 14:30) [11]
> AFAIK, это был Ctrl+Z, т.е. $1E.
$1A, sorry.
Ну, тут уже и без этого разобрались.
--
Regards, LVT.
Leonid Troyanovsky (2005-10-06 14:30:00) [11]
> Германн © (06.10.05 14:16) [4]
> $15 считался признаком конца файла.
AFAIK, это был Ctrl+Z, т.е. $1E.
--
Regards, LVT.
MBo (2005-10-06 14:29:00) [12]Если кодировать текст таким образом, то файл уже не текстовый, и обращаться с ним нужно соответствующим образом. Нужен закодированный текстовый - значит, нужно правильно кодировать.
Ни к чему разные вещи смешивать.
Германн (2005-10-06 14:28:00) [13]Ну и глупо закодированный файл "пихать" в StringList ДОперекодировки.
clickmaker (2005-10-06 14:24:00) [14]
> leonidus © (06.10.05 14:17) [5]
а ты уверен, что у тебя в файле нет символов с кодом 0? Тогда надо либо наследовать стринглист и переписывать SetTextStr, либо читать как бинарник, можно API - CreateFile / ReadFile. И я не верю, что это дольше. СтрингЛист-то в конечном итоге все равно к АПИ обращается.
Bel (2005-10-06 14:21:00) [15]Если мне не изменяет память, символ конца файла = 26 = #1A.
isasa (2005-10-06 14:20:00) [16]$1A (Ctrl+Z) ?
leonidus (2005-10-06 14:17:00) [17]я делаю так:
f_:=tstringlist.Create;
f_.LoadFromFile(Edit2.Text+'code');
st:='';
for i:=0 to f_.Count-1 do
st:=st+f_.Strings[i];
f_.Free;
так вот в этом случае чтение ведется до первого символа EOF.
Пробовал читать BlockRead, нормально, но очень долго.
Германн (2005-10-06 14:16:00) [18]Вообще-то где-то, когда-то было такое. $15 считался признаком конца файла. Но не знаю я как написать программу, которая на нем "запиналась" :(
clickmaker (2005-10-06 14:12:00) [19]и кто тебе мешает читать до конца файла, а не до этого символа?
leonidus (2005-10-06 14:06:00) [20]да