/*
by Flea
*/
int LZSSDecode(unsigned char * in,unsigned char * out,int szin,int szout)
{
szin = szin > 0? szin: 0x7fffffff;
int i, j, k, r = 0, pr, pi = 0,po = 0;
unsigned int flags = 0;
unsigned char buf[0x100F], c;
for (i = 0; i < 0x100F; buf[i] = 0x20, i++);
while (pi < szin && po < szout)
{
if (((flags >>= 1) & 256) == 0)
{
if(pi >= szin)break;
c = in[pi++];
flags = c | 0xff00;
}
if (flags & 1)
{
if(pi >= szin || po >= szout)break;
c = in[pi++];
out[po++] = c;
buf[r++] = c;
r &= 0xfff;
} else
{
if(pi + 1 >= szin)break;
i = in[pi++];
j = in[pi++];
i |= (j & 0xf0) << 4;
j = (j & 0x0f) + 2;
pr = r;
for (k = 0; k <= j; k++)
{
c = buf[(pr - i + k) & 0xfff];
if(po >= szout)break;
out[po++] = c;
buf[r++] = c;
r &= 0xfff;
}
}
}
return pi;
}
解决方案 »
- table表查询的问题
- dbgrid怎么打印啊,我急着要啊,大哥,大姐麻烦拉!!小弟学Delphi才第三天啊!
- cxGrid中显表,字段可能增加减少,所以要动态创建例名后,Properties(ComboBox),怎么创建呢
- 请问用dbgrid控件如何能实现可以在当前数据行进行编辑,而按回车键或者下箭头不会新增加记录
- 急:关于Delphi中MDI窗口Panel面板布局的问题?
- 如何实现类似网页的frame框架?
- 一个数据库操作问题
- 为什么总有内存地址报错:(
- 请问大家有什么好的压缩软件啊
- 帮忙看一下类的问题
- 请教一下delphi网页问题
- Delphi 使用shockwaveflash控件的问题
VAR i, j, k, r, pr, pi, po: Integer;
flags : INTEGER;
buf : ARRAY[0..$100F] OF byte;
c : byte;
BEGIN IF szin <= 0 THEN
szin := $7FFFFFFF;
r := 0;
pi := 0;
po := 0;
flags := 0;
i:=0;
while(i<$100F) DO
BEGIN
buf[i] := $20;
WHILE (pi < szin) AND (po < szout) DO
BEGIN
IF (((flags SHR 1) AND 256) = 0) THEN
BEGIN
IF (pi >= szin) THEN break;
c := cin[pi];
pi := pi + 1;
flags := c OR $FF00;
END;
IF ((flags AND 1) <> 0) THEN
BEGIN
IF (pi >= szin) OR (po >= szout) THEN break;
c := cin[pi];
pi := pi + 1;
cout[po] := c;
po := po + 1;
buf[r] := c;
r := r + 1;
r := r AND $FFF;
END
ELSE
BEGIN
IF (pi + 1 >= szin) THEN break;
i := cin[pi];
pi := pi + 1;
j := cin[pi];
pi := pi + 1;
i := i OR (j AND $F0) SHL 4;
j := (j AND $0F) + 2;
pr := r;
FOR k := 0 TO j DO
BEGIN
c := buf[(pr - i + k) AND $FFF];
IF (po >= szout) THEN break;
cout[po] := c;
po := po + 1;
buf[r] := c;
r := r + 1;
r := r AND $FFF;
END;
END;
i:=i+1;
END;
result := pi;
END;
END;这里粗略翻翻可能有问题在自己检查下
VAR i, j, k, r, pr, pi, po: Integer;
flags : INTEGER;
buf : ARRAY[0..$100F] OF byte;
c : byte;
BEGIN IF szin <= 0 THEN
szin := $7FFFFFFF;
r := 0;
pi := 0;
po := 0;
flags := 0;
i:=0;
while(i<$100F) DO
BEGIN
buf[i] := $20;
WHILE (pi < szin) AND (po < szout) DO
BEGIN
IF (((flags SHR 1) AND 256) = 0) THEN
BEGIN
IF (pi >= szin) THEN break;
c := cin[pi];
pi := pi + 1;
flags := c OR $FF00;
END;
IF ((flags AND 1) <> 0) THEN
BEGIN
IF (pi >= szin) OR (po >= szout) THEN break;
c := cin[pi];
pi := pi + 1;
cout[po] := c;
po := po + 1;
buf[r] := c;
r := r + 1;
r := r AND $FFF;
END
ELSE
BEGIN
IF (pi + 1 >= szin) THEN break;
i := cin[pi];
pi := pi + 1;
j := cin[pi];
pi := pi + 1;
i := i OR (j AND $F0) SHL 4;
j := (j AND $0F) + 2;
pr := r;
FOR k := 0 TO j DO
BEGIN
c := buf[(pr - i + k) AND $FFF];
IF (po >= szout) THEN break;
cout[po] := c;
po := po + 1;
buf[r] := c;
r := r + 1;
r := r AND $FFF;
END;
END; END;
i:=i+1;
END;
result := pi;END;