Thread timestamp (19 answers)
Opened by jan10001 at 2003-08-26 21:48

Strat
 2003-08-27 13:44
#32087 #32087
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=SirLant,27.08.2003, 11:12]Strat, was bedeutet das A und das J bei dem unpack?
Und wenn unpack und pack so unterschätzt werden,
sollte jemand (DU :)) schnellstens nen Tutorial für
diese beiden Funktionen schreiben :)[/quote]
also pack und unpack sind die Perl-Internen Mittel erster Wahl, wenn es um Daten mit fixen Satzlaengen geht, oder auch die Konvertierungen von Zeichenketten (z.B. little-endian <=> big_endian)

pack liefert einen String zurueck und erwartet als ersten Parameter eine Formatanweisung und als zweiten eine Liste.
unpack geht den umgekehrten Weg und gibt eine Liste zurueck, und erwartet als ersten Parameter eine Formatanweisung und als zweiten einen String.

Die Formatanweisung besteht aus mehreren Paaren der Form:
Format Laenge, z.B.
Code (perl): (dl )
print pack("A20 A30 A10", $var1, $var2, $var3);

Es gibt z.B. die Variable $var1 linksbuendig auf zwanzig Zeichen aus (und schneidet im Gegensatz zu (s)printf auch ab, wenn $var1 zu lang ist), danach $var2 auf der laenge von 30 und dann $var3 auf der Laenge von 10

Folgende Formatanweisungen werden haeufig verwendet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
A  ein ASCII-String, mit Leerzeichen aufgefuellt
Z ein mit NULL terminierter String (ASCIZ)
b Bitstring (aufsteigende Bitanordnung, wie z.B. vec)
B Bitstring (absteigende Bitanordnung)
h Hex-String (niedriegste Stelle zuerst)
H Hex-String (hoechste Stelle zuerst)
i Integer mit Vorzeichen
I Integer ohne Vorzeichen
j Integer mit Vorzeichen von Perl (IV)
J Integer ohne Vorzeichen von Perl (UV)
u ein uuencodeter String
U eine Unicode Zeichennummer
w eine BER-komprimierte Integer
x ueberspringe anzahl bytes

Es gibt noch einige weitere, die man aber nur in Spezialfaellen braucht: siehe perldoc -f pack

Beispiel:
Code: (dl )
1
2
3
4
5
6
my $time = localtime(time); print "$time\n";
my ($wday, $month, $day, $time, $year) = unpack("A3 x1 A3 x1 A2 x1 A8 x1 A4", $time);
print "$wday, $day.$month.$year, $time\n";
^Z
Wed Aug 27 11:43:02 2003
Wed, 27.Aug.2003, 11:43:02
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/

View full thread timestamp