Thread pack/unpack Daten von Socket
(27 answers)
Opened by monti at 2012-11-22 19:47
Zunächst einmal: Zeichen sind bytes. pack/unpack macht da nur Sinn, wenn die numerischen Werte dieser bytes gefragt sind, die Zeichen selbst stehen ja schon im Socket (Handle).
Was auf jeden Fall Sinn macht: Die Länge einer byte-Sequenz mit pack "N" in eine binär kodierte Zahl zu setzen. Das kann dann abwechselnd passieren, so dass ganze Arrays oder Hashes aus einem Socket gelesen werden können. Ich habe hier mal ein Beispiel für Upload/Download: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 elsif($self->param('downconfig')){ #$self->dd($self->{SHOPCONFIG}); $self->header( 'Content-Type' => 'application/octet-stream', 'Content-Disposition' => "Attachment; filename=shopcfg.$self->{LANG}", ); use bytes; foreach my $k(keys %{$self->{SHOPCONFIG}}){ my $klen = length $k; my $vlen = length $self->{SHOPCONFIG}{$k}; #die "$self->{SHOPCONFIG}{$k} $vlen"; $self->{CONTENT} .= pack("N",$klen).$k.pack("N",$vlen).$self->{SHOPCONFIG}{$k}; } } elsif($self->param('upload')){ my $fh = $self->param('upfile') or die "Keine Datei angegeben\n"; use bytes; my $buffer = ''; my %cfg = (); while( read($fh, $buffer, 4) ){ my $klen = unpack "N", $buffer; read($fh, $buffer, $klen); # key in buffer my $key = $buffer; read($fh, $buffer, 4); my $vlen = unpack "N", $buffer; read($fh, $buffer, $vlen); # value in buffer $cfg{$key} = $buffer; } $self->{SHOPCONFIG} = \%cfg; tied($self->{SHOPCONFIG})->write or die $@; $self->header( Status => "301 Moved", Location => $self->{URL}, ); } Was einen hash in eine binary sequence serialisiert und umgekehrt. Beim Upload wird aus dem Handle $fh gelesen, der Algorithmus ist gut zu sehen. |