Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
8-1135447050
Nigel
2005-12-24 20:57
2006.05.21
System volume


2-1146557123
49 Cent
2006-05-02 12:05
2006.05.21
Можно ли изменить угол для Timage?


2-1146671776
Мурзилка
2006-05-03 19:56
2006.05.21
не работает программа на другом компе


15-1145858794
Spirit of RO
2006-04-24 10:06
2006.05.21
Используете ли вы


2-1146751112
Юнкер
2006-05-04 17:58
2006.05.21
Как правильно указать размер UDPClient.BufferSize ?