![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Распаковка ZDecompressStream [D7, WinXP]
Chaser © (2007-09-28 16:19:00)Привет всем!
Вопрос по упаковке/распаковке Zlib (нужно по сети передать StringList).
Пакую так:
var
Str: TStringList;
Memstr,CompressStream: TMemoryStream;
begin
...
Str.SaveToStream(Memstr);
ZCompressStream(Memstr,CompressStream,zcDefault);
CompressStream.Position:=0;
AThread.Connection.OpenWriteBuffer;
AThread.Connection.WriteInteger(CompressStream.Size);
AThread.Connection.WriteStream(CompressStream);
AThread.Connection.CloseWriteBuffer;
...
end;
Распаковка:
ms.Clear;
n:=Form1.IdTCPClient.ReadInteger(true);
Form1.IdTCPClient.ReadStream(ms,n);
ZDecompressStream(ms,msd);
Str.LoadFromStream(msd);
...
В итоге "msd" почему-то равняется 0, хотя "ms" равен какому-то числу (т.е. данные есть).
Вот не пойму, почему не распаковывается поток?
Chaser (2007-09-28 17:28:00) [1]Всем спасибо, как всегда ошибка закралась в невнимательности (((
Str.SaveToStream(Memstr);
Memstr.Position:=0; <- забыл дописать
ZCompressStream(Memstr,CompressStream,zcDefault);
Вопрос закрыт.
Сергей М. (2007-09-28 17:08:00) [2]И, кстати, нет нужды явно вызывать методы WriteInteger, ReadInteger.
Посмотри внимательно на параметры методов WriteStream, ReadStream - при определенных значениях эти методы способны делать то же самое (т.е. писать/читать префикс размера потока), но неявно.
Сергей М. (2007-09-28 17:04:00) [3]Ну наверно из-за того что на передающей стороне CompressStream.Size = 0
Chaser (2007-09-28 17:01:00) [4]Из-за чего так может быть?
Chaser (2007-09-28 17:00:00) [5]msd.size конечно же.
Сергей М. (2007-09-28 16:50:00) [6]
> "msd" почему-то равняется 0
Объект не может быть ранен ни нулю, ни "какому-то числу".