Hi!
- was ist das NUL-Element von dem bei pack() (unter a und @) die Rede ist?
NUL ist ein Byte mit dem Wert 0. Das Element a füllt, wenn der String kleiner war als die Längenangabe, die restlichen Bytes mit 0 auf, das @ positioniert den Schreibzeiger absolut vom Anfang an auf die angegebene Position und füllt vom derzeitigen Zeiger bis dorthin mit 0-Bytes auf.
a42@42 ist eine sinnlose Aneinanderreihung, wenn das a bereits am Anfang steht. Denn einerseits füllt das a bereits bis zu 42 Byte und das @ macht dasselbe nochmal. Wenn die Längenangaben unterschiedlich sind oder das a bei gleicher Längenangabe nicht das erste Element ist, sieht das etwas anders aus.
- warum gibt es beim Mixbeispiel im pack im Prinzip vier Formatanzeiger: a56, @56 und zwei mal V und nur drei Werte ("irgendeinstring", 44927, 128). Was habe ich da missverstanden?
@ positioniert und füllt nur, es fügt keine Nutzdaten hinzu.
- Warum komme ich nicht mit
$out_mix2 = unpack('a56V2', $test_mix);
var_dump($out_mix2);
>
> Output
> 'V2' => string 'irgendeinstring' (length=15)
Das V2 wird als Key-Name interpretiert.
> oder:
> `$out_mix2 = unpack('a56/V2', $test_mix);`{:.language-php}
>
> Output:
> array
> 1 => int 44927
> 2 => int 128
>
> an den Inhalt von $test\_mix?
Hier legt V2 die beiden Schlüssel 1 und 2 an und sein 1 überschreibt das Element 1 von a56. Du solltest Namen vergeben. Auf der englischen Handbuchseite zu unpack() steht auch noch eine zweite gelbe Box, die explizit diese Problematik erwähnt. Die deutsche Seite hat nur den ziemlich kurzen Hinweis auf das Benennen im einleitenden Text.
> Durch die Antworten hoffe ich ein besseres Verständnis für Binärformate zu erhalten.
Eher von der Arbeitsweise von pack()/unpack(). Zu Binärformaten hast du nichts gefragt.
Lo!