我是先在客户端把STREAM进行压缩。压缩方法是这样子的:
ys:=TCompressionStream.Create(clMax,outstream);
ys.CopyFrom(instream,0); //instream是待压缩的流
ys.Free;
jy:=TDeCompressionStream.Create(outstream);
jy.Position:=0;
然后把压缩后的流转换成VARIANT传递到应用服务器端。应用服务器端接收到以后先把VARIANT转换成STREAM,然后把STREAM解压缩。语句如下:
//对压缩流outstream进行解压
jy:=TDeCompressionStream.Create(ysstream); //ysstream是解压后的流
jy.Position:=0;
//然后读出解压缩后流的内容
jyRead := jy.Read(buf, ysstream.Size); //这句就报错了。而且就报“ERROR”,没报别的。
但是我试过,如果其中少了对流压缩和解压的过程,直接把STREAM转换成VARIANT.然后VARIANT转换成STREAM,最后读出STREAM的内容。那么过程就很顺利。
ys:=TCompressionStream.Create(clMax,outstream);
ys.CopyFrom(instream,0); //instream是待压缩的流
ys.Free;
jy:=TDeCompressionStream.Create(outstream);
jy.Position:=0;
然后把压缩后的流转换成VARIANT传递到应用服务器端。应用服务器端接收到以后先把VARIANT转换成STREAM,然后把STREAM解压缩。语句如下:
//对压缩流outstream进行解压
jy:=TDeCompressionStream.Create(ysstream); //ysstream是解压后的流
jy.Position:=0;
//然后读出解压缩后流的内容
jyRead := jy.Read(buf, ysstream.Size); //这句就报错了。而且就报“ERROR”,没报别的。
但是我试过,如果其中少了对流压缩和解压的过程,直接把STREAM转换成VARIANT.然后VARIANT转换成STREAM,最后读出STREAM的内容。那么过程就很顺利。
解决方案 »
- 请问delphi中如何在一个form里调用另一个form的procedure
- delphi 程序中输出EXCEL表格显示数值时如何设置千分位
- 怎样把图象存在sql server2000中?
- 关于一个第三方控件的用法..
- 小弟有一事不明,大家过来帮帮忙!动态赋值问题
- 有奖找错 50分相赠 谢谢。。。。。。。。。。。
- 可用分太多。想。。。。。。如何从Outlook中导出邮件到自己做的邮件工具中。
- TQuickReport如何连接adotable?
- 如何设置ADO数据表的过滤条件?
- SFTP
- 陪伴自己n久的Nokia终于被SomeOne"拿"走了,散分!解晦气
- stringgrid中用拖放来交换任意两个单元的内容
jyRead := jy.Read(buf, ysstream.Size); //这句就报错了。而且就报“ERROR”,没报别的。
实际报错的是ysstream.Size,所以我在处理这个问题的时候是先,将这个大小写入压缩流前面,然后在解压缩前,先读取该数值,然后不用yestream.Size,而用那个读取出来的数据。先是压缩流:
procedure TFilePacket.PackStream(var Stream: OleVariant);
var
ZStream: TCompressionStream;
InStream:TMemoryStream;
TempStream:TMemoryStream;
BStream:TMemoryStream;
Param:OleVariant;
p:Pointer;
pi:Pointer;
pj:Pointer;
bSize:int64;
begin
InStream:=TMemoryStream.Create;
BStream:=TMemoryStream.Create;
TempStream:=TMemoryStream.Create;
pi:=VarArrayLock(Stream);
try
TempStream.Write(pi^,VarArrayHighBound(Stream,1)+1);//这里是实际的数据流
ZStream:=TCompressionStream.Create(cldefault, InStream);
try
ZStream.CopyFrom(TempStream,0);//将实际数据流压缩
finally
ZStream.Free;
end;
Param:=VarArrayCreate([0,InStream.Size-1+sizeof(bSize)],varByte);
p:=VarArrayLock(Param);
try
pj:=Addr(bSize);
bSize:=TempStream.Size;//获取实际流的长度
BStream.Write(pj^,sizeof(bSize));//写入实际流的长度
BStream.Position:=sizeof(bSize);
InStream.Position:=0;
BStream.CopyFrom(InStream,InStream.Size);//接着实际流长度数据后面写入压缩流
bstream.Position:=0;
BStream.Read(p^,BStream.Size);
finally
VarArrayUnlock(Param);
end;
finally
VarArrayUnlock(Stream);
InStream.Free;
TempStream.Free;
BStream.Free;
end;
Stream:=Param;
end;读数据流:
procedure TFilePacket.UnPackStream(var Stream: OleVariant);
var
TempStream:TMemoryStream;
OutStream:TMemoryStream;
ZStream: TDecompressionStream;
BStream:TMemoryStream;
Param:OleVariant;
p:Pointer;
po:Pointer;
bSize:int64;
pj:Pointer;
begin
TempStream:=TMemoryStream.Create;
BStream:=TMemoryStream.Create;
OutStream:=TMemoryStream.Create;
p:=VarArrayLock(Stream);
try
TempStream.Write(p^,VarArrayHighBound(Stream,1)+1);//还原为数据流
pj:=Addr(bSize);
TempStream.Position:=0;
TempStream.Read(pj^,sizeof(bSize));//读出实际流的大小
TempStream.Position:=sizeof(bSize);//移动指针到压缩流的起始位置
if TempStream.Size>0 then BStream.CopyFrom(TempStream,TempStream.Size-sizeof(bSize));//读出压缩
BStream.Position:=0;
ZStream:=TDecompressionStream.Create(BStream);//解压缩
zstream.Position:=0;
try
OutStream.CopyFrom(ZStream,bSize);//还入实际流的长度,而不是使用BStream或ZStream的Size属性
Param:=VarArrayCreate([0,OutStream.Size-1],varByte);
po:=VarArrayLock(Param);
try
OutStream.Position:=0;
OutStream.Read(po^,OutStream.Size);
finally
VarArrayUnlock(Param);
end;
finally
ZStream.Free;
end;
finally
VarArrayUnlock(Stream);
BStream.Free;
OutStream.Free;
TempStream.Free;
end;
Stream:=Param;
end;
OutStream.CopyFrom(ZStream,bSize);//还入实际流的长度,而不是使用BStream或ZStream的Size属性更正为:
OutStream.CopyFrom(ZStream,bSize);//带入实际流的长度,而不是使用BStream或ZStream的Size属性
procedure Compress(InStream,OutStream:TStream); //压缩函数
var tmp:TCompressionStream;
Count:integer;
buffer:pointer;
begin
Count:=Instream.Size ;
OutStream.Writebuffer(Count,sizeof(integer));
tmp:=TCompressionStream.Create(clmax,OutStream);
try
InStream.Position :=0;
getmem(buffer,Count);
try
InStream.Readbuffer(buffer^,Count);
tmp.Writebuffer(buffer^,Count);
finally
freemem(buffer);
end;
finally
tmp.Free ;
end;
end;procedure DeCompress(InStream,OutStream:TStream);//解压函数
var tmp:TDeCompressionStream;
Count:integer;
buffer:pointer;
begin
InStream.Position :=0;
InStream.Readbuffer(Count,sizeof(integer));
tmp:=TDeCompressionStream.Create(InStream);
try
getmem(buffer,Count);
try
tmp.Readbuffer(buffer^,Count);
OutStream.Writebuffer(buffer^,Count);
finally
freemem(buffer);
end;
finally
tmp.Free ;
end;
end;