Jörk Behrends: zu GIF-Dateiformat

Beitrag lesen

Hi!

Im Moment knobel ich halt noch an PERL rum.
Hab' meine Testdatei mal mit jeder Menge
$gif .= hex("xyz's"); zusammengebaut und versucht
sie wieder rauszuschreiben.

Ich habe mal folgendes zusammen getippert ... einfach mal ausprbieren ;-)
--------------------------------------------------------------
#!/usr/bin/perl

sub LZW
{
    my ($inBits, $inStringBytes) = @_;

my $outBits, $moreBitsCode, %table, $lastCode, $inStringBits, @inChunks, $outStringBits, $buffer;

my $CC = 2 ** $inBits;
    my $EOI = $CC + 1;

$inStringBits = join('', map {unpack 'b8', $_} split('',$inStringBytes));
    @inChunks = grep {$_} split("(.{0,$inBits})", $inStringBits);

@table{(map {unpack("b$inBits", pack("I", $_))} 0..$CC-1), 'CC', 'EOI'} = map {pack("I", $_)} (0..$EOI);
    $outBits = $inBits + 1;
    $moreBitsCode = 2 ** $outBits;
    $lastCode = $EOI;

$outStringBits = unpack("b$outBits", $table{'CC'});
    $buffer = '';

foreach $code (@inChunks)
    {
        if (exists $table{$buffer . $code})
        {
            $buffer .= $code;
        }
        else
        {
            $outStringBits .= unpack("b$outBits", $table{$buffer});
            $table{$buffer . $code} = pack("I", ++$lastCode);
            $buffer = $code;

if ($lastCode == $moreBitsCode)
            {
                ++$outBits;
                $moreBitsCode *= 2;
            }
        }
    }

if ($buffer)
    {
        $outStringBits .= unpack("b$outBits", $table{$buffer});    
    }

$outStringBits .= unpack("b$outBits", $table{'EOI'});

return join('', map {pack('b8', $_)} (grep {$_} split('(.{0,8})', $outStringBits)));
}

my $toCode = pack("h32", "0123456789ABCDEF"x2);
my $coded  = &LZW(4, $toCode);

print join(' ', map {unpack 'H2', $_} split('',$coded));
print "\n10 04 31 48 31 07 25 B5 58 73 8F 44 59 98 C6 79 60 04\n";
--------------------------------------------------------------

Jörk