![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
А-а! Почему TDecompressionStream распаковывает не то?! [D7, WinXP]
Aleksandr. © (2005-03-03 16:03:00)Упаковываю MemoryStream:
procedure DoEncode(M: TMemoryStream);
var
Z : TCompressionStream;
Buf : array of byte;
i,j : cardinal;
D : TStream;
begin
M.Seek(0,0);
i:=M.Size;
D:=TMemoryStream.Create;
Z:=TCompressionStream.Create(clDefault,D);
try
SetLength(Buf,i);
j:=M.Read(Buf[0],i);
if i<>j then
raise Exception.Create('Length diffs!');
Z.Write(Buf[0],i);
D.Seek(0,0);
M.Clear;
M.Write(i,SizeOf(i)); // write size of uncompressed data
SetLength(Buf,D.Size);
D.Read(Buf[0],Length(Buf));
M.Write(Buf[0],length(Buf));
M.Seek(0,0)
finally
Z.Free;
D.Free
end;
то бишь сразу после упаковки перед данными пишется размер пакуемого Stream.
Затем я пытаюсь распаковать упакованный Stream:
procedure DoDecode(M: TMemoryStream);
var
Z : TDeCompressionStream;
Buf : array of byte;
i : cardinal;
D : TMemoryStream;
begin
M.Seek(0,0);
M.Read(i,SizeOf(i)); // read size of uncompressed file
D:=TMemoryStream.Create;
try
SetLength(Buf,M.Size-M.Position);
M.Read(Buf[0],length(Buf));
D.Write(Buf[0],length(buf));
D.Seek(0,0);
Z:=TDecompressionStream.Create(D);
try
SetLength(Buf,i);
i:=Z.Read(Buf[0],i);
if i<>Length(Buf) then
raise Exception.Create('length diffs!')
finally
Z.Free
end
finally
D.Free
end;
M.Clear;
M.Write(Buf[0],i);
M.Seek(0,0)
end;
Так вот на ошибочку с
if i<>Length(Buf) then
raise Exception.Create('length diffs!')
я все время и получаю! То есть TDeCompressionStream распаковывает полученные данные с другим размером! Что тут не так?
Aleksandr. (2005-03-03 17:07:00) [1]MU :
Да, верное. И при компрессе возвращает правильное число ужатых байт.
Пришлось пока все заменить на CompressBuf/DecompressBuf, и все работает правильно, но нафига тогда нужны объекты...
MU (2005-03-03 16:34:00) [2]извините еще раз :)
а тут, когда вы только считали размер, значение i верное?
M.Seek(0,0);
M.Read(i,SizeOf(i)); // read size of uncompressed file
Aleksandr. (2005-03-03 16:10:00) [3]MU :
В чем тут Вы видите бред? Что, по-Вашему, надо писать в качестве количества байт записываемой информации?
MU (2005-03-03 16:09:00) [4]извините, ошибся... :(
MU (2005-03-03 16:07:00) [5]Что за бред?!
M.Write(i, SizeOf(i));
SizeOf + F1