求字符串压缩函数或例子 求一个对字符串进行压缩及解压缩的函数,要求压缩后的结果也是一个字符串. 源字符串由英文字母和数字组成.找了好久了,总找不到,网上的都是一些二进制压缩的例子. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你就不会改吗??uses ...,Zlib;function CompressString(Str: string): string;var instream: Tmemorystream; zstream: Tcompressionstream; outstream: Tmemorystream; size: integer;begin instream := Tmemorystream.Create; try instream.Write(Str[1], Length(Str)); if instream.Size = 0 then exit; size := instream.size; outstream := Tmemorystream.create; zstream := Tcompressionstream.Create(clmax, outstream); try instream.SaveToStream(zstream); zstream.free; outstream.Position := 0; instream.clear; instream.WriteBuffer(size, sizeof(size)); instream.CopyFrom(outstream, 0); instream.Position := 0; SetLength(Result, instream.Size); instream.ReadBuffer(Result[1], instream.Size); finally outstream.free; end; finally instream.Free; end;end;function DeCompressString(Str: string): string;var instream: Tmemorystream; zstream: Tdecompressionstream; outstream: Tmemorystream; size: integer; buffer: pchar;begin instream := Tmemorystream.Create; try instream.Write(Str[1], Length(Str)); if instream.Size = 0 then exit; instream.Position := 0; instream.ReadBuffer(size, sizeof(size)); getmem(buffer, size); outstream := Tmemorystream.create; zstream := Tdecompressionstream.Create(instream); try zstream.Readbuffer(buffer^, size); outstream.WriteBuffer(buffer^, size); outstream.Position := 0; instream.clear; instream.CopyFrom(outstream, 0); instream.Position := 0; SetLength(Result, instream.Size); instream.ReadBuffer(Result[1], instream.Size); finally zstream.free; outstream.Free; freemem(buffer); end; finally instream.Free; end;end;procedure TForm1.Button1Click(Sender: TObject);var str: string;begin Str := CompressString('1234567890'); //压缩 Caption := DeCompressString(str); //解压缩end; 那你就不能对不可见的字符串循环一下,取其ASCII码值吗 >>那你就不能对不可见的字符串循环一下,取其ASCII码值吗取了ASCII码那怎么还原? 介绍一下 aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错 回复人: steelxu5(人间漫步) ( ) 信誉:100 2005-07-05 22:42:00 得分: 0 介绍一下 aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错 *********** 如果重复数少于单个数,那这个压缩还有何意义 paranoia190(190) 能不能贴出来看看?偶给100分 欢迎加入DELPHI 程序员群 1805366 参加技术讨论 !! aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符这样的压缩方式就是最基本的RLE压缩方法,对于一些特定的重复性高的文件来讲压缩起来压缩比很大,而如果重复性很低的情况,那么压缩比也非常的低,推荐楼主使用LZW压缩算法,这个压缩算法的压缩比很高,并且WinZIP和WinRAR都是使用LZW的改进算法 function pCryptStr(const s: string;const bEncrypt: boolean = True): string;var Key : Integer; i : integer; ps, pr : ^byte;begin Key := 9898; SetLength(Result, Length(s)); ps := @s[1]; pr := @Result[1]; for i := 1 to length(s) do begin pr^ := ps^ xor (9898 shr 8); if bEncrypt then Key := (pr^ + Key) * 1234 + 5678 else Key := (ps^ + Key) * 1234 + 5678; pr := pointer(integer(pr) + 1); ps := pointer(integer(ps) + 1); endend; 界面多时钟 Delph7 Record, object or class type required 错误 怎样在delphi中做水银防伪底纹?不胜感激! 如何汉化昆腾的TcxGrid的资源文件 几个帮助属性有什么联系,如何正确使用他们!? 求一SQL语句 请问怎样才能获得当前网络的传输速率? access mdb 密码问题 TWebBrowser如何捕捉网页的错误并屏蔽 如何把image中图像存入dbgrid和access 关于DBGRID的问题 抽象类--〉〉〉〉为什么要有抽象类,他存在的意义是什么?? 各位指点..
uses
...,Zlib;function CompressString(Str: string): string;
var
instream: Tmemorystream;
zstream: Tcompressionstream;
outstream: Tmemorystream;
size: integer;
begin
instream := Tmemorystream.Create;
try
instream.Write(Str[1], Length(Str));
if instream.Size = 0 then exit;
size := instream.size;
outstream := Tmemorystream.create;
zstream := Tcompressionstream.Create(clmax, outstream);
try
instream.SaveToStream(zstream);
zstream.free;
outstream.Position := 0;
instream.clear;
instream.WriteBuffer(size, sizeof(size));
instream.CopyFrom(outstream, 0);
instream.Position := 0;
SetLength(Result, instream.Size);
instream.ReadBuffer(Result[1], instream.Size);
finally
outstream.free;
end;
finally
instream.Free;
end;
end;function DeCompressString(Str: string): string;
var
instream: Tmemorystream;
zstream: Tdecompressionstream;
outstream: Tmemorystream;
size: integer;
buffer: pchar;
begin
instream := Tmemorystream.Create;
try
instream.Write(Str[1], Length(Str));
if instream.Size = 0 then exit; instream.Position := 0;
instream.ReadBuffer(size, sizeof(size));
getmem(buffer, size);
outstream := Tmemorystream.create;
zstream := Tdecompressionstream.Create(instream);
try
zstream.Readbuffer(buffer^, size);
outstream.WriteBuffer(buffer^, size);
outstream.Position := 0;
instream.clear;
instream.CopyFrom(outstream, 0);
instream.Position := 0;
SetLength(Result, instream.Size);
instream.ReadBuffer(Result[1], instream.Size);
finally
zstream.free;
outstream.Free;
freemem(buffer);
end;
finally
instream.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
begin
Str := CompressString('1234567890'); //压缩
Caption := DeCompressString(str); //解压缩
end;
取了ASCII码那怎么还原?
aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错
介绍一下
aaaaa 6 77 bb--->5a16272b 即第1位代表有几个,第2 位是原字符楼上的算法应不错
***********
如果重复数少于单个数,那这个压缩还有何意义
这样的压缩方式就是最基本的RLE压缩方法,对于一些特定的重复性高的文件来讲压缩起来压缩比很大,而如果重复性很低的情况,那么压缩比也非常的低,推荐楼主使用LZW压缩算法,这个压缩算法的压缩比很高,并且WinZIP和WinRAR都是使用LZW的改进算法
var
Key : Integer;
i : integer;
ps, pr : ^byte;
begin
Key := 9898;
SetLength(Result, Length(s));
ps := @s[1];
pr := @Result[1];
for i := 1 to length(s) do
begin
pr^ := ps^ xor (9898 shr 8);
if bEncrypt
then Key := (pr^ + Key) * 1234 + 5678
else Key := (ps^ + Key) * 1234 + 5678;
pr := pointer(integer(pr) + 1);
ps := pointer(integer(ps) + 1);
end
end;