/*
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;
}

解决方案 »

  1.   

    FUNCTION LZSSDecode(cin, cout: pbytearray; szin, szout: integer): integer;
    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;这里粗略翻翻可能有问题在自己检查下
      

  2.   

    FUNCTION LZSSDecode(cin, cout: pbytearray; szin, szout: integer): integer;
    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;