我现在想用Delphi 中自带的zlib算法进行一个字符串的压缩与解压缩,但不知怎么用,希望高手能够
提供完整的原代码,我希望是两个函数,一个是压缩函数,传入一个字符串返回一个被压缩的字符
串,一个是解压缩函数,传入一个被压缩过的字符串,返回一个原串,着急呀,不够还可以加分,万
分感激!!!
提供完整的原代码,我希望是两个函数,一个是压缩函数,传入一个字符串返回一个被压缩的字符
串,一个是解压缩函数,传入一个被压缩过的字符串,返回一个原串,着急呀,不够还可以加分,万
分感激!!!
解决方案 »
- 晕死这么简单的问题也报错procedure pxpx(sf:string;aa:array[0..999] of stype);也报错?
- open存储过程时,出现EDBEngineError,Invalid Parameter错误,急!
- 在深圳一家公司面试题目?各位说如何回答最佳?俺已被淘汰了
- 对我来说很难的一个问题,在线等
- 请教一个问题 我的软件别人也用了(代码别人也有) 我想在我的程序一旦安装之后别人就安装不了
- 紧急求救100分,GhostMethod问题
- 如何在“在线帮助”中找到“Create Custom Components”?
- (讨论)大家谈谈插件技术啊,像winamp这样的?
- pchar与string
- 关于SQL Server的数据类型转化问题
- 求助:如何将上载文件中的数据写到数据库中去?
- delphi 关于引用OCX构件
有Demo,已经封装好的,比起Dlphi自带那个好用的http://lysoft.7u7.net
下面是一个压缩OleVariant的,楼主自己去吧,里面是先转成流再压缩,所以楼主可以只看数据流压缩部分
====================================
//压缩
procedure 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 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);
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;
流可以直接调一个文件LoadFromFile,
也可以直接把字符串往里写的SetSize、Write
begin
DestStream.Write(PChar(SourceText)^,Length(SourceText));
end;procedure StreamToText(SourceStream:TStream;var DestText:String);
begin
SetLength(DestText,SourceStream.Size);
SourceStream.Seek(0,0);
SourceStream.Read(PChar(DestText)^,SourceStream.Size);
end;再昏,这CSDN,咋贴个Base64编码代码都说偶骂人,无语……
=====================================================
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09DQovL0Jhc2U2NLHgwuuzzNDyDQovL7G+zsS1xNb31rzKx8D708O7urPlx/gNCi8v
wLS89cnZttRUU3RyZWFtwOC1xLLZ1/cNCi8v0tS78cihuPy437XE0KfCyg0KLy+xvs7EtbHW0LXE
u7qz5cf4tPPQocno1sPWtQ0KLy/Kx86qwcuy4srU0Ke5+7b4yei2qLXEDQovL7nKyrnTw8qx1+66
w72ruMPWtcnUuMTQodK7teMNCi8vDQovLyjT0cfpzOHKvjrQodDE0uez9ikNCg0KY29uc3QgQlVG
RkVSX1NJWkUgPQk1MzgwOyAgICAgICAgICAgICAgIC8vu7qz5cf4tPPQobv5yv0NCmNvbnN0IEJV
RkZFUl9TSVpFXzM9CUJVRkZFUl9TSVpFKig1NyswKTsgLy/V67bUtdqx4MLrNTe49tfWt/vM7bzT
0ru7u9DQt/sNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy+5
ytSktsHIobu6s+XH+M6qNTe1xM67yv0NCmNvbnN0IEJVRkZFUl9TSVpFXzQ9CUJVRkZFUl9TSVpF
Kig3NisyKTsgLy+x4MLruvO1xLu6s+XH+LTz0KHU8s6qOg0KICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAvL9SktsHIobTz0KEgZGl2IDMgKiA0ICsgMiAqINDQyv0N
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8oNTcgZGl2IDMg
KiA0ICsgMikqILv5yv0NCi8vQmFzZTY0wuux7Q0KY29uc3QgQmFzZTY0VGFibGU6QXJyYXlbMC4u
NjNdIG9mIGNoYXI9KCdBJywnQicsJ0MnLCdEJywnRScsJ0YnLCdHJywnSCcsDQogICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0knLCdKJywnSycsJ0wnLCdNJywnTicsJ08n
LCdQJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUScsJ1InLCdT
JywnVCcsJ1UnLCdWJywnVycsJ1gnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICdZJywnWicsJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsDQogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgJ2cnLCdoJywnaScsJ2onLCdrJywnbCcsJ20nLCduJywN
CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbycsJ3AnLCdxJywncics
J3MnLCd0JywndScsJ3YnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICd3JywneCcsJ3knLCd6JywnMCcsJzEnLCcyJywnMycsDQogICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgJzQnLCc1JywnNicsJzcnLCc4JywnOScsJysnLCcvJw0KICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsNCi8vttS7urPlx/i9+NDQseDC6w0K
ZnVuY3Rpb24gRW5jb2RlQmFzZTY0Q2hhcihWYWx1ZTpBcnJheSBvZiBjaGFyOw0KICAgICAgICAg
ICAgICAgICAgICAgICAgICBMZW46aW50NjQpOlN0cmluZzsNCnZhcg0KICAgQnVmZmVyMTpBcnJh
eVswLi5CVUZGRVJfU0laRV80XSBvZiBjaGFyOyAvL7HgwuvK5LP2u7qz5cf4DQogICBpMTppbnQ2
NDsNCmJlZ2luDQogICBpMTo9MDsNCiAgIHdoaWxlIGkxPExlbiBkbw0KICAgYmVnaW4NCiAgICAg
IC8vw7/I/bj21KSx4MLr19a3+86q0rvX6aOsseDC67PJzqrLxNfWt/sNCiAgICAgIC8vyKHUpLHg
wuu12tK719a3+7XEx7DB+cLrzqrK5LP2wuu1xLXa0rvX1rf71Nqx4MLrse3W0LXEy/fS/brFDQog
ICAgICAvL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18NCiAgICAgIC8voaGhoaH9oe6h7qHuoe6h/Q0KICAgICAgLy+jsKOwo7GjsaOxo7GjsaOxo7Gj
saOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxDQogICAgICAvL6GhoaGpwKH6oaGjsaGh
oaGh+6nIqcCh+qGho7KhoaGhofupyKnAofqhoaOzoaGhoaH7qcgNCiAgICAgIC8voaGhoaO4o7ej
tqO1o7Sjs6Oyo7GjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsQ0KICAgICAgLy+jsKOw
o7GjsaOxo7GjsaOxDQogICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0NCiAgICAgIEJ1ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTEr
MF06PUJhc2U2NFRhYmxlWygoaW50ZWdlcihWYWx1ZVtpMV0pIHNociAyKSBhbmQgJDAwM2YpXTsN
Cg0KICAgICAgLy/IodSkseDC67Xa0rvX1rf7tcS688G9wuvT67Xatv7UpMLr19a3+7XEx7DLxMLr
1+m6z86qyuSz9sLrtcS12rb+19a3+9TaseDC67Ht1tC1xMv30v26xQ0KICAgICAgLy9fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAvL6Gh
oaGhoaGhoaGhoaGhoaGh/aHuoe6h7qHuof0NCiAgICAgIC8vo7CjsKOxo7GjsaOxo7GjsaOxo7Gj
saOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsQ0KICAgICAgLy+hoaGhqcCh+qGho7GhoaGh
ofupyKnAofqhoaOyoaGhoaH7qcipwKH6oaGjs6GhoaGh+6nIDQogICAgICAvL6GhoaGjuKO3o7aj
taO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsaO4o7ejtqO1o7Sjs6Oyo7ENCiAgICAgIC8voaGhoaGh
oaGhoaGho7CjsKOxo7GjsaOxo7GjsQ0KICAgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICBCdWZmZXIxW2kxIGRpdiA1NyoyK2kx
IGRpdiAzK2kxKzFdOj1CYXNlNjRUYWJsZVsoKEludGVnZXIoVmFsdWVbaTFdKSBhbmQgJDAwMDMp
IHNobCA0KSBvciAoKEludGVnZXIoVmFsdWVbaTErMV0pIHNociA0KSBhbmQgJDAwMGYpXTsNCg0K
ICAgICAgLy/IodSkseDC67Xatv7X1rf7tcS688vEwuvT67XayP3UpMLr19a3+7XEx7DBvcLr1+m6
z86qyuSz9sLrtcS12sj919a3+9TaseDC67Ht1tC1xMv30v26xQ0KICAgICAgLy9fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQogICAgICAvL6GhoaGh
oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGh/aHuoe6h7qHuof0NCiAgICAgIC8vo7CjsKOxo7GjsaOx
o7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsQ0KICAgICAgLy+hoaGhqcCh
+qGho7GhoaGhofupyKnAofqhoaOyoaGhoaH7qcipwKH6oaGjs6GhoaGh+6nIDQogICAgICAvL6Gh
oaGjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOzo7KjsaO4o7ejtqO1o7Sjs6Oyo7ENCiAgICAg
IC8voaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGho7CjsKOxo7GjsaOxo7GjsQ0KICAgICAgLy8tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogICAgICBC
KFZhbHVlW2kxKzFdKSBhbmQgJDAwMGYpIHNobCAyKSkgb3IgKChJbnRlZ2VyKFZhbHVlW2kxKzJd
KSBzaHIgNikgYW5kICQwMDAzKV07DQoNCiAgICAgIC8vyKHUpLHgwuu12sj919a3+7XEuvPB+cLr
zqrK5LP2wuu1xLXay8TX1rf71Nqx4MLrse3W0LXEy/fS/brFDQogICAgICAvL19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCiAgICAgIC8voaGhoaGh
oaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaH9oe6h7qHuoe6h/Q0KICAgICAgLy+j
sKOwo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxo7GjsaOxDQogICAg
ICAvL6GhoaGpwKH6oaGjsaGhoaGh+6nIqcCh+qGho7KhoaGhofupyKnAofqhoaOzoaGhoaH7qcgN
CiAgICAgIC8voaGhoaO4o7ejtqO1o7Sjs6Oyo7GjuKO3o7ajtaO0o7OjsqOxo7ijt6O2o7WjtKOz
o7KjsQ0KICAgICAgLy+hoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGjsKOwo7Gj
saOxo7GjsaOxDQogICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0NCiAgICAgIEJ1ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErM106
PUJhc2U2NFRhYmxlW0ludGVnZXIoVmFsdWVbaTErMl0pIGFuZCAkMDAzZl07DQoNCiAgICAgIEJ1
ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErNF06PWNocigwKTsgLy+7urPlx/jK5LP2tK69
4cr4serWvg0KDQogICAgICBpZigoKGkxKzMpIG1vZCA1Nyk9MCkgdGhlbiAgICAgICAgICAgICAg
ICAgIC8vw7+x4MLrNTfX1rf7zO2807u70NC72LO1t/sNCiAgICAgIGJlZ2luDQogICAgICAgICBC
dWZmZXIxW2kxIGRpdiA1NyoyK2kxIGRpdiAzK2kxKzRdOj1jaHIoMTMpOzsNCiAgICAgICAgIEJ1
ZmZlcjFbaTEgZGl2IDU3KjIraTEgZGl2IDMraTErNV06PWNocigxMCk7DQogICAgICBlbmQ7DQog
ICAgICBpMTo9aTErMzsNCiAgIGVuZDsNCg0KICAgQnVmZmVyMVtCVUZGRVJfU0laRV80XTo9Y2hy
KDApOyAvL86qQnVmZmVyIHRvIFN0cmluZyDUpNbDveHK+LHq1r4NCg0KICAgUmVzdWx0Oj1TdHJp
bmcoQnVmZmVyMSk7DQplbmQ7还真有一大段发不上来
Procedure EncodeBase64File(FileName:String;
DestStream:TStream;
ShowMsg:Boolean=true);
var
SourceStream:TFileStream;
Buffer:Array[0..BUFFER_SIZE_3] of char; //预读缓冲区
ssLen:int64;
DestString:String;
p:Pointer;
i:Int64;
sLen:int64;
StartTime,EndTime:TDateTime;
begin
ssLen:=0;
//打开文件
SourceStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite );
StartTime:=Now();//开始计时
try
i:=0;
while i<SourceStream.Size do
begin
ssLen:=SourceStream.Size-i; //取文件剩余长度
if(ssLen>BUFFER_SIZE_3)then //如果超过预读缓冲取
ssLen:=BUFFER_SIZE_3; //则只读取缓冲区大小
SourceStream.ReadBuffer(Buffer,ssLen); sLen:=ssLen;
case (ssLen mod 3) of //是否为三的倍数,否则添'0'补齐
2:
begin
Buffer[ssLen+0]:=chr(0);
Buffer[ssLen+1]:=chr(0);
sLen:=sLen+2;
end;
1:
begin
Buffer[ssLen]:=chr(0);
Inc(sLen);
end;
end; //编码
DestString:=EncodeBase64Char( Buffer,sLen);
sLen:=Length(DestString);
p:=PChar(DestString); DestStream.Seek(0,soFromEnd); //将编码后的数据
DestStream.WriteBuffer(p^,sLen);//添加到末尾 i:=i+BUFFER_SIZE_3;
end; //当数据不足三位时,会使用0补齐,
//如果将会导致乱码数据的出现,
//由此在Base64编码当中规定,
//不足的冲分在编码后需要使用'='字符
//替换补齐的字符 ssLen:=4; //预置替换“补齐”的位置为最后两个
if DestString[sLen]=chr(10) then//若最后添加的两个是换行回车符
ssLen:=ssLen+2; //则把位置往前移两位 case (SourceStream.Size mod 3) of
1:
begin
DestString:='==';
p:=PChar(DestString);
DestStream.Seek(2-ssLen,soFromEnd);
DestStream.WriteBuffer(p^,Length(DestString));
end;
2:
begin
DestString:='=';
p:=PChar(DestString);
DestStream.Seek(3-ssLen,soFromEnd);
DestStream.WriteBuffer(P^,Length(DestString));
end;
end; EndTime:=Now(); //结束计时 sLen:=SourceStream.Size; //取输入长度
ssLen:=DestStream.Size; //取输出长度 finally
SourceStream.Free();
end; //显示编码报告
if ShowMsg then
MessageBox(GetActiveWindow(),PChar(
'File:'+FileName+chr(13)+chr(10)+
'Source File Length:'+IntToStr(sLen)+chr(13)+chr(10)+
'Dest Stream Length:'+IntTOStr(ssLen)+chr(13)+chr(10)+
'Start At:'+TimeToStr(StartTime)+chr(13)+chr(10)+
'Over At:'+TimeToStr(EndTime)+chr(13)+chr(10)+
'Consumed:'+TimeToStr(EndTime-StartTime)),
'EncodeBase64 (File to Stream)',
MB_OK);
end;