Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизANSI код символа EOF Найти похожие ветки
← →
leonidus © (2005-10-06 14:01) [0]Люди подскажите пожалуйста ANSI код символа EOF. Дело в том, что в результате кодирования тектового файла путем изменения ANSI кодов каждого символа в соответсвии с ключом кодирования где-то в середине файла появляется знак EOF и потом при чтении этого файла программа на этот моменте "запинается" т.е. считает что файл уже весь считан, хотя это не так. Как мне узнать код символа EOF, что бы еще на этапе кодирования если такой символ получается просто заменять его на безобидный символ?
← →
clickmaker © (2005-10-06 14:04) [1]какая программа? твоя?
← →
leonidus © (2005-10-06 14:06) [2]да
← →
clickmaker © (2005-10-06 14:12) [3]и кто тебе мешает читать до конца файла, а не до этого символа?
← →
Германн © (2005-10-06 14:16) [4]Вообще-то где-то, когда-то было такое. $15 считался признаком конца файла. Но не знаю я как написать программу, которая на нем "запиналась" :(
← →
leonidus © (2005-10-06 14:17) [5]я делаю так:
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, нормально, но очень долго.
← →
isasa © (2005-10-06 14:20) [6]$1A (Ctrl+Z) ?
← →
Bel © (2005-10-06 14:21) [7]Если мне не изменяет память, символ конца файла = 26 = #1A.
← →
clickmaker © (2005-10-06 14:24) [8]
> leonidus © (06.10.05 14:17) [5]
а ты уверен, что у тебя в файле нет символов с кодом 0? Тогда надо либо наследовать стринглист и переписывать SetTextStr, либо читать как бинарник, можно API - CreateFile / ReadFile. И я не верю, что это дольше. СтрингЛист-то в конечном итоге все равно к АПИ обращается.
← →
Германн © (2005-10-06 14:28) [9]Ну и глупо закодированный файл "пихать" в StringList ДО перекодировки.
← →
MBo © (2005-10-06 14:29) [10]Если кодировать текст таким образом, то файл уже не текстовый, и обращаться с ним нужно соответствующим образом. Нужен закодированный текстовый - значит, нужно правильно кодировать.
Ни к чему разные вещи смешивать.
← →
Leonid Troyanovsky © (2005-10-06 14:30) [11]
> Германн © (06.10.05 14:16) [4]
> $15 считался признаком конца файла.
AFAIK, это был Ctrl+Z, т.е. $1E.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2005-10-06 14:33) [12]
> Leonid Troyanovsky © (06.10.05 14:30) [11]
> AFAIK, это был Ctrl+Z, т.е. $1E.
$1A, sorry.
Ну, тут уже и без этого разобрались.
--
Regards, LVT.
← →
leonidus © (2005-10-06 14:37) [13]>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;
и где может быть трабла?
← →
leonidus © (2005-10-06 14:39) [14]может есть более протые и быстрые методы кодирования текстовых файлов? тут критично не время шифромания, а время дешифрования, т.е. файл шифруется один раз а расшифровывается в программе довольно часто
← →
clickmaker © (2005-10-06 14:44) [15]ну для начала я бы писал так
if (kod = 0) or (kod > 255) then
st[i] := "_"
VCL при чтении файла не юзает никаких EOF, кроме реального конца файла. Можешь убедиться, открыв исходники и проследив TStrings.ReadFromFile -> ReadFromStream -> TFileStream.Read -> FileRead -> ReadFile. Последний - АПИшный вызов, ему на все символы, включая EOF и пр. глубоко фиолетово, он читает файл как есть
Трабла скорей всего в стринглисте
← →
Anatoly Podgoretsky © (2005-10-06 14:56) [16]leonidus © (06.10.05 14:01)
Ошибка в постановке, у тебя не текстовый файл соответвтвенно с ним надо работать как с двоичным.
leonidus © (06.10.05 14:39) [14]
Нельзя работать с закодированным файлом как с текстовым, в нем все коды от 0 до 255, надо его упаковывать, тогда пойдут и методы работы с текстовыми файлами.
← →
leonidus © (2005-10-06 15:14) [17]что значит упаковать, zip`ом?
← →
leonidus © (2005-10-06 16:07) [18]>clickmaker а почему символы больше 255 исключать? дело в том что у меня при суммировании: kod:=ord(st[i])+ord(key[n]); kod как правило больше 255 получается....
← →
Anatoly Podgoretsky © (2005-10-06 16:48) [19]leonidus © (06.10.05 15:14) [17]
ЗИП не подходит - это точно такой же двоичный формат, нужна транспортная упаковка, например HEX ил Base64, UUE
← →
clickmaker © (2005-10-06 17:02) [20]
> leonidus © (06.10.05 16:07) [18]
потому что, если у тебя не unicode, то код символа должен быть от 0 до 255 - 1 байт то бишь
← →
leonidus © (2005-10-06 22:10) [21]Я прочел нормально файл из потока:
FS := TFileStream.create(...);
try
SetLength(Str, FS.Size);
FS.Read(Pointer(Str)^, Length(str));
finally
FS.Free
end;
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c