[Vienna-pm] Gibt es eigentlich ..

gooly at gmx.at gooly at gmx.at
Fri Apr 27 02:35:39 PDT 2007


Hmm,
mein Fehler, ich war nicht genau genug.

Jedes Zeichen wird ja normalerweise mit 8 oder 16 bit 'ver-coded', 10 
Zahlen wäre so 80 oder 160 bit - richtig?
Wenn ich aber _nur_ 16 Zeichen habe, bräuchte ich eigentlich nur 3 bit 
um alles zu codieren, ergo nur 30 bits ergo 38% bzw 12,5%. Eventuell 
noch eine kleine weitere Verbesserung, wenn man das häufigste Zeichen 
zB den Delimiter ';' mit zwei statt drei bits 'ver-coded' und eventuell 
noch mehr, wenn man nicht alle 16 braucht.

So müsste dann den resultierende String bitweise zusammenbaut werden.

Insofern wäre halt nicht der String als Ganzes sondern es muss jedes 
einzelne Zeichen bearbeitet werden. Ich dachte an eine Funktion, der 
man den Zeichensatz und den String übergibt und der den komprimierten 
String zurückgibt:
Ich stellte mir daher so etwas vor:
  foreach my $s ((split //, $orgStr)) {
     setNext3Bits( $s );
  }
Ich bräuchte dann auch eine 3Bit-Kombination als Zeilenende oder 
Recordende.
Zum (De-) Kompriemieren brauch daher nur an beiden 'Enden' den hash bzw 
die Zuordnung:
   Zeichen => 3BitCode,
...
  3BitCode => Zeichen


Am Freitag, 27. April 2007 schrieb Wolfgang Laun:
> Die gewünschten Zeichen (max. 16) können mit tr/// auf [0-9a-f]
> abgebildet werden. Diese können mit pack auf die halbe Länge gepackt
> werden. Die Umkehrung ist trivial. Vermutlich ist es notwendig, die
> ursprünglichen Länge mitzupacken, da mit 'H*' immer eine gerade
> Anzahl von Zeichen entpackt wird (vgl. 2. Test).
>
> my $s = "abcdefghijklmnop";
> print "s=$s\n";
> $s =~ tr/abcdefghijklmnop/0123456789abcdef/;
> my $p = pack( 'H*', $s );
> print "length p = " . length( $p ) . "\n";
> my $u = unpack( 'H*', $p );
> $u =~ tr/0123456789abcdef/abcdefghijklmnop/;
> print "u=$u\n";

hmm, brauch ich da nicht zum dekomprimieren den Orginalcode anyway?
Calli


More information about the Vienna-pm mailing list