Thread pack/unpack Daten von Socket (27 answers)
Opened by monti at 2012-11-22 19:47

rosti
 2012-11-22 20:42
#163531 #163531
User since
2011-03-19
3218 Artikel
BenutzerIn
[Homepage]
user image
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.

View full thread pack/unpack Daten von Socket