hotti: Verhalten von pack() bei 32-Bit Zahlen

Beitrag lesen

hi,

bischen ausführlicher, heute morgen war meine Zeit knapp ;)

Beispiele in Perl, dürfte auch mit PHP genauso funktionieren:

  
my @liste = unpack "N", "WORD"; # Erzeuge genau einen Integer aus 4 Byte  
print "@liste\n"; # sehe die Zahl 1464816196  
  
# Nehme die Zahl 1464816196 und erzeuge die 4 Bytes:  
print pack("N", 1464816196), "\n";  # sehe "WORD"  
  
# Nehme die Zahl und Schablone "V":  
print pack("V", 1464816196), "\n";  # sehe "DROW"  
  
# Unterschied ist klar, V dreht die Bytes rum.  

Die Schablone "N" oder "V" passt also genau auf 4 byte, 32 bit. Hastu

  
my @liste = unpack "NN", "WORDWORD"; # Erzeuge genau zwei Integer aus 8 Byte  
print "@liste\n"; # siehst Du 1464816196 1464816196  

Beachte, dass Bytes nicht immer als Text lesbar sind, aber "WORD" ist ein schönes Beispiel ;)

Der Vollständigkeit halber nehmen wir mal eine andere Schablone:

  
my @liste = unpack "CCCC", "WORD"; # Erzeuge eine Liste  
print "@liste\n"; # siehst Du: 87 79 82 68  

Schablone "C" steht im Gegensatz zu "N" nicht für 4 byte, sondern für 1 byte. Die Umkehrung von pack() zu unpack() ist nun hoffentlich verständlich.

Anmerkung: Schablone "N" oder "V" erzeugt aus _jeder_ Zahl, egal ob 1 oder 99 oder 125343 stets genau 4 byte. Dies ist die Grundlage dafür, Datenstrukturen in Binärsequenzen zu transformieren und umgekehrt: Binärdateien zu lesen. In der letzten Ausgabe des Perl-Magazin "Foo" gibt es dazu einen Artikel von mir,

Viele Grüße,
 Rolf Rost (Hotti)