Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Есть ли 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.035 c
3-1091011103
vic
2004-07-28 14:38
2004.08.22
QRStringsBand


1-1092038278
Goorus
2004-08-09 11:57
2004.08.22
Класс-контейнер


3-1090459928
Euronymous
2004-07-22 05:32
2004.08.22
Drag n Drop внутри DBGrid...


9-1083916238
Маг Гыр
2004-05-07 11:50
2004.08.22
Видеопамять


14-1091671990
Думкин
2004-08-05 06:13
2004.08.22
С днем рождения! 5 августа





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский