我的程序通讯使用xml,想对xml做一点压缩,有什么好的算法吗?(100分)

  • 主题发起人 主题发起人 satanmonkey
  • 开始时间 开始时间
S

satanmonkey

Unregistered / Unconfirmed
GUEST, unregistred user!
其实我就是想要一个字符串的压缩算法,最好有vb和delphi代码
 
参照Vclzip的
 
什么意思?
 
压缩文件的话Delphi自带了一个ZLIB可以搞定的。
 
我要压缩的是流或者字符串
 
最好的办法就是不要用XML,自定义一套格式。
不要跟我说XML有扩展性,因为设计良好的程序都有扩展性。
XML根本不适合做比较高性能的通讯程序,因为一个形式比内容
多的通讯报文根本就不能指望有好的效率。
 
就算是自己定义的格式,也可以压缩啊。
根据我的经验,字符串的压缩比很大,现在不管使用不使用xml
找到一种对字符串压缩的算法是很有用的。
 
这个问题首先应该是在一个特定通讯程序使用怎么样的报文格式的问题,
其次才可能是一个寻求好的报文压缩算法的问题。

如果进一步讨论,就需要santanmokey给出,你的系统是在怎么样的一个
应用场景中使用。比如 什么用的网络情况, 一个报文大小可能在什么范围内,
发送的频率有多高,要求响应的速度是多少等等。只有给出适用的条件才有进
一步探讨的基础。

虽然XML现在好象比较热,但在一般通讯应用中我是比较反对使用XML的。
因为XML的报文严格格式带来的大量格式标签,使得报文体积太大,
即便压缩传送,压缩与解压缩带来一些的消耗。姑且不论这些传输问题,
就接到报文的处理而言,就需要解析XML的内容。而解析XML可是个消耗资源
很大的工作,DOM接口是有名的消耗大户。SAX接口要好不少,但比一般的读
字节数,读特定符号还是要消耗大不少。如果是使用MS的XML parser在一般应用中
性能还过得去,如果要是使用java的XML Parser只怕要在性能提高上花大功夫了。
我认为只有在对发送频率也较低,响应速度要求不高,且处理复杂,变动性又大的
商业数据报文中比较适合用XML格式。对性能有较大要求的应用场景,大多不适合。
 
我主要传送的是ado的recordset对象生成的xml
因为我的表比较大,所以传起来慢,想压缩以后提高点性能。
 
如果是传送Recordset那你的整个设计思想也该改改了!
 
不是传recordset是recordset生成的xml
 
Delphi自身的Zlib单元有压缩功能,和Zip的压缩率差不多。
文本的压缩率可是很大的呀
 
哪个zlib能压缩流吗?
 
当然,他就是用来压缩流的
 
asp支持zlib吗?
我的成许有一方是用asp的。
 
引用TUTI:这个问题首先应该是在一个特定通讯程序使用怎么样的报文格式的问题,
其次才可能是一个寻求好的报文压缩算法的问题。
TUTI说的没错,可在以后有时间再慢慢来,先解决压缩的问题吧
DELPHI自带的ZLIB单元里有现成的,可用来压缩流.
如果你要压缩字符串,可用TMemoryStream装载它.
unit CompressProc;
interface
procedure Compress(var CompressedStream: TMemoryStream);
procedure UnCompress(var CompressedStream: TMemoryStream);
implementation
uses
zlib, Classes;
procedure Compress(var CompressedStream: TMemoryStream);
var
SourceStream: TCompressionStream;
DestStream: TMemoryStream;
Count: Integer;
begin
Count := CompressedStream.Size;
DestStream := TMemoryStream.Create;
SourceStream:=TCompressionStream.Create(clMax, DestStream);
Try
CompressedStream.SaveToStream(SourceStream);
SourceStream.Free;
CompressedStream.Clear;
CompressedStream.WriteBuffer(Count, SizeOf(Count));
CompressedStream.CopyFrom(DestStream, 0);
finally
DestStream.Free;
end;
end;

procedure UnCompress(var CompressedStream: TMemoryStream);
var
SourceStream: TDecompressionStream;
DestStream: TMemoryStream;
Buffer: PChar;
Count: integer;
begin
CompressedStream.Seek(0,soFrombegin
ning);
CompressedStream.ReadBuffer(Count, SizeOf(Count));
GetMem(Buffer, Count);
DestStream := TMemoryStream.Create;
SourceStream := TDecompressionStream.Create(CompressedStream);
Try
SourceStream.ReadBuffer(Buffer^, Count);
DestStream.WriteBuffer(Buffer^, Count);
DestStream.Position := 0;
//复位流指针
CompressedStream.LoadFromStream(DestStream);
finally
FreeMem(Buffer);
DestStream.Free;
end;
end;

end.
 
问题是我有一端是asp,用zlib能在asp那变解开吗?
我要找种asp和delphi都支持的压缩方法。
 
没用过ASP,不过你可以把之前的解压方法封装在DLL或是ACTIVEX之类的
让ASP来调不行的吗?
实在不行就在ASP端将收到的字符串存成文本,ASP直接读文本总是可以的
 
后退
顶部