Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Формат GZip где я не прав? [D7, WinXP]


Slym ©   (2005-04-13 10:21:00) 

1 При распаковке (RAR) жалуется на неверный CRC, но исправно распаковывает!!!
2 IExplorer не читает этот файл если при Accept-Encoding: gzip
но Reget его исправно выкачивает (также в gzip)(ему наверно чихать на CRC)
CRC32 исходно файла расчитывается правильно, может я не туда ложу его в архиве?
по стандарту:
заголовок 10байт (я использую только основной заголовок) ->
поток deflate->
crc32 4байта ->размер распакованный 4байта.

сравнивал два архива одного файла зажатый моим модулем и сжатый GZipом... конец (8 байт) одинаковый. GZip распаковывает нормально, на мой жалуется на CRC (RAR)
мой модуль:
unit GZip;

interface
uses classes,zlib,crc32;

procedure CompressStream(Source,Dest:TStream);
procedure CompressStreamInplace(Source:TStream);

implementation
type
 TGZipHeader=packed record
   ID1:byte;
   ID2:byte;
   CM:byte;
   FLG:byte;
   MTIME:integer;
   XFL:byte;
   OS:byte;
 end;
 TGZipEnd=packed record
   Crc32:integer;
   Size:integer;
 end;
const DefGZipHeader:TGZipHeader=(ID1:31;ID2:139;CM:8;FLG:0;MTIME:0;XFL:2;OS:255);

procedure CompressStream(Source,Dest:TStream);
var
 MemoryStream:TMemoryStream;
 CompressionStream:TCompressionStream;
 GZipEnd:TGZipEnd;
begin
 GZipEnd.Crc32:=Crc32Stream(Source,0);
 GZipEnd.Size:=Source.Size;
 Dest.WriteBuffer(DefGZipHeader,SizeOf(DefGZipHeader));
 MemoryStream:=TMemoryStream.Create;
 try
   CompressionStream:=TCompressionStream.Create(clMax,MemoryStream);
   try
     CompressionStream.CopyFrom(Source,0);
   finally
     CompressionStream.Free;
   end;
   MemoryStream.Seek(2,soBeginning);//Skip first 2 bytes!
   Dest.CopyFrom(MemoryStream,MemoryStream.Size-2);
 finally
   MemoryStream.Free;
 end;
 Dest.WriteBuffer(GZipEnd,SizeOf(GZipEnd));
end;

procedure CompressStreamInplace(Source:TStream);
var Dest:TMemoryStream;
begin
 Dest:=TMemoryStream.Create;
 try
   CompressStream(Source,Dest);
   Source.Size:=0;
   Source.CopyFrom(Dest,0);
 finally
   Dest.Free;
 end;
end;

end.


Slym   (2005-04-15 04:55:00) [1]

Что я делаю:
Серверок на IDHttpServer (Indy10)... с возможностью сжимать контент:
Deflate сжатие работает!, но GZip более широко поддерживается (опираюсь на возможности имеющегося совта) и нужен именно GZip!


Slym   (2005-04-15 04:52:00) [2]

Хм... Третьи сутки пошли... Такой простой формат GZip, а помочь никто не хочет... Весь rfc1952 прочитал (может у меня с аглицким плохо), все по нему: не работает!


Наверх

Титульная страница Поиск, карта сайта Написать письмо