直接存储位置:
var _sbuf
acked array [1..20] of char;
// 假设你已经输入
_dbuf
acked array [1..20*10] of char;
// 输出结果: (字符:下个索引,位置...位置)...(字符:下个索引,位置...位置)...
_dnum:integer;//压缩长度
{
例如:
Source: 0 1 0 5 9 1 5 5 6 6 7 1 0 5 7 8 1 0 1 8
// 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
结果:_DBuf中的结构
#7为下个索引的位置
'0': 偏移1到6: #48#7#1#3#13#18
#48为'0', #1,#3,#13,#18为位置
#15为下个索引的位置
'1': 偏移7到14: #49#15#2#6#12#17#19
#49为'1', #2,#6,#12,#17为位置
}
procedure Compress;
var
i,j,k:integer;
begin
_dnum:=1;//压缩长度计数
for i:=0 to 9do
// 仅仅"0".."9"
begin
_dbuf[_dnum]:=chr($30+i);
k:=0;//该数字的个数
for j:=1 to 20do
//仅仅20个数字
begin
if _sbuf[j]=chr($30+i) then
begin
inc(k);
_dbuf[_dnum+1+k]:=chr(j);//存储位置
end;
end;
if (k<>0) then
//该数值存在,写入个数,不存在的不压缩存储
begin
_dbuf[_dnum+1]:=chr(_dnum+1+k+1);//下个位置的索引
_dnum:=_dnum+1+k;//压缩长度
end;
end;
if (_dnum>20) then
begin
showmessage('编码压缩失败 !');
end;
end;
end;