Текущий архив: 2006.05.21;
Скачать: CL | DM;
Вниз
Помогите с потоками TStream! Найти похожие ветки
← →
DiMonstr (2006-04-29 16:46) [0]Кратенько о проблемном исходнике.
Код выполняет следующие операции. Создаем файловый поток и поток для хранения данных в памяти. Далее выделяем для файла память GetMem(Buf,sz) и загружаем в буфер Buf. А затем, в зависимости от первого символа нам нужно расшифровать данные потока или продолжит выполнение другой работы. Так вот расшифровка реализована таким образом, что мы побайтно берем из буфера Buf данные, расшифровываем через процедуру DecryptB и загоняем байт в поток MemStream. Ну а там читаем из MemStream в общий буфер Buf и продолжаем работу.
Но не тут-то было. После перегонки из одного потока в MemStream через цикл побайтной раскодировки и загрузки в Buf - в нем ничего нет!!! Потом тыкал-тыкал и решил поставить переменную, в которую команда MemStream.Write(B, 1); должна возвратить кол-во записанных байт. ПО моему байты в поток не пишутся!
Подскажите в чем тут дело!!!
Заранее всем благодарен. С нетерпением жду ответа.
var
sz : DWORD;
ExB: Word;
Buf, MemBuf: PChar;
FByte, CountB, i: integer;
DeStream: TFileStream;
MemStream : TStream;
B : byte;
begin
lbCreateFile.Caption := GetFileDate(CASFile);
DeStream := TFileStream.Create(CASFile, fmOpenRead);
MemStream := TMemoryStream.Create;
try
sz := DeStream.Size;
if sz = 0 then
Messagebox(0,"Предупреждение!",0)
else StateFile := True;
if StateFile then
begin
GetMem(Buf,sz);
try
DeStream.Read(Buf^,sz);
FByte := ORD(Buf^);
// Если FByte = #136 = $88 = "символ евро",
// значит файл данных зашифрован, поэтому
// начинаем расшифровку со следующего байта
if FByte = 136 then
begin
Application.CreateForm(TPasswordForm, PasswordForm);
PasswordForm.ShowModal;
if PasswordForm.blnOK then
begin
DeStream.Position := 1;
Password := PasswordForm.edtPassword.Text;
PasswordForm.Free;
for CountB := 1 to sz-1 do
begin
DeStream.Read(B, 1);
B := DecryptB(B, CountB);
MemStream.Position := MemStream.Size;
i := MemStream.Write(B, 1);
end;
end
else
begin
PasswordForm.Free;
ShowMessage("Пароль введён неверно! Файл не может быть открыт.");
Exit;
end;
end;
MemStream.Read(Buf^, sz);
FByte := ORD(Buf[0]);
{ ....... Работа с буфером Buf .......... }
finally
FreeMem(Buf);
end;
end;
finally
DeStream.Free;
MemStream.Free;
end;
end;
← →
Джо © (2006-04-29 16:57) [1]Код вызывает много всяких вопросов (неприятных)...
В частности, замени на MemStream : TMemoryStream, а там посмотрим.
← →
Kilkennycat © (2006-04-29 18:13) [2]MemStream.Position := MemStream.Size;
не понял, зачем это...
end;
MemStream.Read(Buf^, sz);
а где возврат в начало?
← →
DiMonstr (2006-04-29 20:14) [3]
> В частности, замени на MemStream : TMemoryStream, а там
> посмотрим.
Эт я уже менял по всякому, безрезультатно.
> MemStream.Position := MemStream.Size;
> не понял, зачем это...
А это мы отсчитываем поцицию в потоке по одному байту. Кстати и без этого тоже не работает.
> MemStream.Read(Buf^, sz);
> а где возврат в начало?
Какой ещё возврат. Мы же ссылаемся на содержимое. И вообще, когда из файлового потока пишу в буфер Buf всё же нормально. Пробовал и таким образом MemStream.Read(Buf[0], sz) - бестолковое занятие! Как ни крути, во-второй поток не удается перегнать байты.
Парни, в чём дело??? Я уже с ног сбился. Хоть пиши заного другим способом.
← →
Virgo_Style © (2006-04-29 20:20) [4]DiMonstr (29.04.06 20:14) [3]
А это мы отсчитываем поцицию в потоке по одному байту.
DiMonstr (29.04.06 20:14) [3]
Какой ещё возврат. Мы же ссылаемся на содержимое.
Странные вы какие-то %-)
Первое действие - это перемещение указателя в конец потока.
А затем - попытки читать за его пределами.
← →
Eraser © (2006-04-29 20:21) [5]
> DiMonstr (29.04.06 20:14) [3]
есть подозрение, что ваш алгоритм шифрования, реализованый в ф-ии DecryptB имеет криптостойкость равную 0.
← →
Eraser © (2006-04-29 20:23) [6]вот в этой статье
http://podgoretsky.com/ftp/Docs/Delphi//CryptoAPI/index.html
есть пример шифрования файла с пом. MS CryptoAPI.
← →
Kilkennycat © (2006-04-29 20:26) [7]
> Какой ещё возврат. Мы же ссылаемся на содержимое
ссылаться можно куда угодно.
я понятия не имею, куда ссылается Buf^, но я точно знаю, что запись
MemStream.Read(Buf^, sz) - это попытка прочитать данные из МемСтрим в количестве сз, и я точно вижу, что не было установки позиции МемСтрима в начало.
А это мы отсчитываем поцицию в потоке по одному байту. Кстати и без этого тоже не работает.
Отсчитываем для записи??? да оно и так всегда там где нужно, при побайтной записи....
← →
Джо © (2006-04-29 20:27) [8]> DiMonstr
Чтение из потока сдвигает указатель (position) на число прочитанных байт. Чудится мне, что проблема может быть в этом. Впрочем, нет времени разбираться.
← →
Лшдлуттнсфе (2006-04-29 20:33) [9]
> Чтение из потока сдвигает указатель (position) на число
> прочитанных байт
как и запись. И указатель потом никуда не девается. Где записали, там +1 прочитаем. И наоборот. Что я и говорил.
← →
DiMonstr (2006-04-30 11:36) [10]Я понял в чем тут дело.
MemStream при создании не получает своего хендла, его просто нет в отличии от DeStream.
MemStream := TMemoryStream.Create;
Скажите как лечить.
← →
Рамиль © (2006-04-30 11:53) [11]
> DiMonstr (30.04.06 11:36) [10]
Какой еще хэндл? Объект нормально создается, что тебе еще надо? Прочитай лучше, что тебе до этого написали.
← →
DiMonstr (2006-04-30 12:42) [12]
> Рамиль © (30.04.06 11:53) [11]
В принципе да, правильно, виноват.
Я прочитал, что мне до этого написали и все равно не догоняю.
Ну неработает у меня побайтная перегонка из DeStream в MemStream. Хоть об пол рашибись.
sz := DeStream.Size;
GetMem(Buf, sz);
for Count := 1 to sz do
begin
DeStream.Read(B, 1);
// здесь раскодируем содержимое B: Byte
MemStream.Write(B, 1);
end;
MemStream.Read(Buf^, sz); // <- не работает, пусто в Buf, тогда как тоже самое делаешь с DeStream.Read(Buf^, sz) - всё нормально:-) ???
← →
Eraser © (2006-04-30 12:44) [13]
> DiMonstr (30.04.06 12:42) [12]
1.for Count := 0 to sz - 1 do
2. вообще к чему ЭТОMemStream.Read(Buf^, sz);
и вообще этот Buf?
← →
DiMonstr (2006-04-30 13:04) [14]
> 1. for Count := 0 to sz - 1 do
Ну это не суть важно, мне просто со второго байта нужно читать.
> 2. вообще к чему ЭТО MemStream.Read(Buf^, sz); и вообще
> этот Buf?
После того как перегоним все байты в MemStream, мы читаем его весь в буфер Buf : PChar; и далее уже работаем с Buf.
А Вы сами попробуйте набрать программку быстро и посмотреть результат. А результатом должно быть наличие раскодированных данных в Buf.
Eraser © (29.04.06 20:21) [5]
А то, что криптостойкости нет, то мне этого и не надо. Мне достаточно того, что данные хранятся в непонятном обычному пользователю формате.
← →
Eraser © (2006-04-30 13:13) [15]
> DiMonstr (30.04.06 13:04) [14]
передMemStream.Read(Buf^, sz);
вставьMemStream.Position := 0;
> А Вы сами попробуйте набрать программку быстро и посмотреть
> результат.
во-первых, у меня нету реализации DecryptB, во-вторых, нету времени :)
> Мне достаточно того, что данные хранятся в непонятном обычному
> пользователю формате.
так какой-нибудь доброжелатель обязательно сделает утилитку, с пом. которой этот формат станет понятен пользователю!
← →
DiMonstr (2006-04-30 13:20) [16]
> во-первых, у меня нету реализации DecryptB, во-вторых, нету
> времени :)
По большому счету подпрограмма DecryptB и не нужна, смысл в том, чтобы скопировать побайтно байт из TFileStream в TMemoryStream. А если нет времени, то это уже другой вопрос. Буду тогда далше экспериментировать пока хватает терпения...
← →
DiMonstr (2006-04-30 13:27) [17]ВОТ ЭТО Я ДУРЕМАА-А-А-Р!!! Целые сутки возни!!! Который раз убеждаюсь, если долго мучится - что-нибудь получится!
Надо было всего навсего, после цикла копирования перевести позицию в MemStream на начало и всё-ё-ё! Вот это я тупанул...
В общем всем спасибо!!!
Можно тему закрывать.
← →
Eraser © (2006-04-30 13:52) [18]
> DiMonstr (30.04.06 13:27) [17]
об этом ещё в [2] писали :)
Страницы: 1 вся ветка
Текущий архив: 2006.05.21;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.043 c