Thread Hash per socket übergeben
(14 answers)
Opened by worst_case at 2010-08-09 18:08 2010-08-09T16:08:43 worst_case Also ich serialisiere gerne auf byte-Ebene ;) Storable.pm ist ok. Zum Selbermachen, zwei Algorithmen: -packe key und value in Records mit fest vorgegebener Länge like this: Code: (dl
)
$rec = pack "Z255Z255", $key, $value; Wiederherstellen: - Lese aus dem Socket Sequenzen mit jeweils 510 Byte (255 + 255) Code: (dl
)
1 while(read $socket, my $bin, 510){ Bei Schablone "Z" ist zu beachten, dass das letzte Byte für eine \0 reserviert ist. Nun kann das aber ggf. länger werden (viele Nullern)... Algorithmus 2: - Verwende Records mit variabler Länge Zum Serialisieren werden key/value immer paarweise in das Socket geschrieben als 4 byte die Länge des key, der key selbst (bytes), 4 byte die Länge des value, die bytes des value. Diese 4 byte bekommst Du mit Code: (dl
)
$len4 = pack "N", length, $key; Das ist dann eine schöne dichte Packung ;) Warum Serialize auf Byte-Ebene? Du bist damit unabhängig von jedwelchen Zeichenkodierungen, musst also nicht überlegen "hat das 'ä' jetzt ein oder zwei byte...", das wird auf Byte-Ebene eben so übertragen, wie es reinkommt und die length()-Funktion liefert im Ergebnis 2 byte, sofern kein Pragma utf8 gesetzt wurde und das 'ä' utf8-kodiert reinkommt. Zum Verständnis: Code: (dl
)
1 # wir haben ein utf8-kodiertes 'ä' --Rolf PS: Möglicherweise ist Pragma utf8 in neueren Perlversionen nicht mehr empfohlen oder ganz raus. |