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

Вниз

Есть ли CRC в TDecompressionStream?   Найти похожие ветки 

 
начинающий   (2004-08-03 15:42) [0]

Как узнать, поврежден ли файл, который создан при помощи TCompressionStream?


 
Digitman ©   (2004-08-03 16:47) [1]

загрузить его содержимое в TDecompressionStream и попытаться декомпрессировать ... возникшее исключение укажет на факт нарушения структуры сжатых данных


 
начинающий   (2004-08-03 17:14) [2]

Как раз именно так я и делал, но иногда случается такое, что до исключения дело даже не доходит: вылетает окошко с сообщением, что произошёл Access violation.


 
Digitman ©   (2004-08-03 17:17) [3]


> произошёл Access violation


а это, по-твоему, не исключение ?


 
начинающий   (2004-08-03 17:28) [4]

Может и исключение, но при этом управление в except не переходит.


 
Sergey_Masloff   (2004-08-03 17:40) [5]

начинающий   (03.08.04 17:28) [4]
>Может и исключение, но при этом управление в except не >переходит.
Ты, мил человек, не из среды ли программу запускаешь когда эти самые иногда случаются? Потому что если исключение в except не приходит то... Стек чтоли рушится? Врядли такой глюк в zlib пропустили


 
начинающий   (2004-08-03 18:30) [6]

Я хоть и начинающий, но такие вещи знаю :) В IDE отключены исключения, и запускаю я программу из Windows Commander 5.0. Единственной причиной появления Access violation я могу считать лишь то, что, возможно, TDecompressStream не всегда может определить, что поток "запорот". Ведь если это было бы не так, значит в архиве присутствует большая избыточность.


 
Sergey Masloff   (2004-08-03 20:19) [7]

начинающий   (03.08.04 18:30) [6]
>Я хоть и начинающий, но такие вещи знаю :)
Это радует. Но в то что в случае сохранения целостности стека ты не попадаешь в обработчик except верить отказываюсь. Давай в студию тестовый код который это вызовет.


 
начинающий   (2004-08-03 20:52) [8]

Код, возможно (даже скорее всего) не блещет чистотой стиля - уж не ругайте строго - делаю лишь первые шаги!
begin
 inStream := TMemoryStream.Create;
 try
   try
     inStream.LoadFromFile(FileName);
   except
     raise EXTReadError.Create
   end;

   UnCryptStream(inStream,Key);
   unZip := TDecompressionStream.Create(inStream);
   try
     try
       unZip.Read(Len,SizeOf(Integer));
//-Когда добавил это - вроди бы ошибки стихли---------
       unZip.Read(LenCopy,SizeOf(Integer));
       if Len<>(not LenCopy) then
         raise EXTContentsDamaged.Create;
//----------------------------------------------------
       GetMem(XMLData,Len+1);
       XMLData[Len] := Chr(0);
       unZip.Read(XMLData^,Len);
       XMLDocument.Active := FALSE;
       XMLDocument.XML.Text := XMLData;
       XMLDocument.Active := TRUE;
     finally
       unZip.Free;
       FreeMem(XMLData)
     end
   except
     raise EXTContentsDamaged.Create
   end
 finally
   inStream.Free
 end
end


 
Sergey Masloff   (2004-08-03 21:14) [9]

Что-то ты не то делаешь
Читаешь 4 байта в буфер - это ты длину исходной строки записал туда изначально?
А потом читаешь в другой буфер следующие 4 байта?
И что потом с ними делается?
if Len<>(not LenCopy) then


 
начинающий   (2004-08-04 11:12) [10]

Именно так: в архиве содержится нечто вроде:
<Len><not Len><0..Len-1>
А Len и LenCopy - обычные переменные типа Integer.
И что Вас здесь так сильно смутило?


 
Digitman ©   (2004-08-04 11:31) [11]


> начинающий   (03.08.04 20:52) [8]


для простоты операторы обработки исключений и конструкторы/диструкторы вспом.объектов опущены

предполагаем , что в сжатом потоке нет ничего лишнего - "чистые" XML-данные

var
inStream, outStream :TMemoryStream;

..
inStream.LoadFromFile(FileName); //грузим сжатые данные из файла
..
UnCryptStream(inStream,Key); //расшифровываем

unZip := TDecompressionStream.Create(inStream);

outStream.CopyFrom(unZip); //распаковываем - здесь возможны исключения, связанные с повреждением

..

XMLDocument.XML.Text := StrPas(PChar(outStream.Memory)); //готово


 
Digitman ©   (2004-08-04 11:33) [12]


> "чистые" XML-данные


+ нуль-терминатор на конце (если использовать StrPas)


 
WondeRu ©   (2004-08-04 11:43) [13]

муть зеленая! Пользуй для сжатия и декомпрессии следующие функции из Mastering Delphi 7:

procedure CompressStream (aSource, aTarget: TStream);
var
 comprStream: TCompressionStream;
begin
 comprStream := TCompressionStream.Create(
   clFastest, aTarget);
 try
   comprStream.CopyFrom(aSource, aSource.Size);
   comprStream.CompressionRate;
 finally
   comprStream.Free;
 end;
end;
 
procedure DecompressStream (aSource, aTarget: TStream) ;
var
 decompStream: TDecompressionStream;
 nRead: Integer;
 Buffer: array [0..1023] of Char;
begin
 decompStream := TDecompressionStream.Create(aSource);
 try
   // aStreamDest.CopyFrom (decompStream, size) doesn"t work
   // properly as you don"t know the size in advance,
   // so I"ve used a similar "manual" code
   repeat
     nRead := decompStream.Read(Buffer, 1024);
     aTarget.Write (Buffer, nRead);
   until nRead = 0;
 finally
   decompStream.Free;
 end;
end;

вообще скачай ZlibEx: www.dellapasqua.com! ZlibEx лишен глюков и быстрее! В стандарте в Делфе Zlib версия 1.04, а в ZlibEx 1.2.1!


 
Sergey_Masloff   (2004-08-04 12:51) [14]

Digitman ©   (04.08.04 11:31) [11]

>XMLDocument.XML.Text := StrPas(PChar(outStream.Memory)); //готово
StrPas на фиг не нужен тут. Это атавизм ;-)
А так все верно.


 
Digitman ©   (2004-08-04 13:04) [15]


> Sergey_Masloff   (04.08.04 12:51) [14]


это было более для наглядности


 
начинающий   (2004-08-04 23:44) [16]

к Digitman ©
Как понимать Ваше: outStream.CopyFrom(unZip); //распаковываем - здесь возможны исключения, связанные с повреждением
Ведь надо:
function CopyFrom(Source: TStream; Count: Int64): Int64;
Или 0 вместо второго параметра, чтобы считать всё. Но откуда Зип знает, когда наступит всё?
Вы сами пробовали читать из TDecompressionStream при помощи CopyFrom? Я пробовал, и когда указывал ноль - выскакивало исключение. Так что размер несжатого файла всё равно придётся куда-то впихивать.
Поправьте меня, если я не прав.


 
Digitman ©   (2004-08-05 08:18) [17]


> начинающий   (04.08.04 23:44) [16]


да, пардон ..
писал навскидку, упустил этот важный момент
действительно, первым в файле должен идти Int64 (для передачи 2-м параметром в decompressstream.CopyFrom), отражающий размер упакованных данных, а следом - собственно упакованные данные

одним словом, загляни в каталог

(%Delphi%)\Demos\Midas\Intrcpt

там есть наглядный пример использования интересующих тебя классов



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

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

Наверх




Память: 0.51 MB
Время: 0.038 c
14-1091799473
mm0
2004-08-06 17:37
2004.08.22
Ламерский вопрос про Bad blocks


4-1089509394
artificial intellegence
2004-07-11 05:29
2004.08.22
Мопед и хуки.


4-1089642335
AD_infiniTUM
2004-07-12 18:25
2004.08.22
Определение, по какой колонке сделан щелчок в ListView


3-1091204257
Донской
2004-07-30 20:17
2004.08.22
Переименование поля в ACCESS из дельфи


3-1090928811
Dolvet
2004-07-27 15:46
2004.08.22
Как урезать нужное колисечтво символов из числового поля