2011-01-06 15 views
1

Warum kann ein solcher Code als pack('i',6) return 0?Funktion pack() liefert 0

All php.net sagt über Rückgabewert dieser Funktion:

Gibt eine binäre Zeichenfolge enthält Daten.

+1

Woher wissen Sie, dass es 0 zurückgibt, was machst du mit dem Rückgabewert? –

+0

Das Format i hängt auch von der Maschine ab, was soll es sein? –

+0

> Woher wissen Sie, dass es 0 zurückgibt, was machst du mit dem Rückgabewert? if (Pack ('S', '6') == 0) – Sergey

Antwort

9

Sie müssen hier etwas genauer sein. Was ist der Rückgabetyp? Es ist eine binäre Zeichenkette, so oft, was Sie sehen, ist nicht, was es tatsächlich enthält.

Es könnte mit ein paar Null-Bytes (d-Wert = 0, \0 char) starten. Da dieses Byte verwendet wird, um Zeichenfolgenenden in C und anderen Sprachen zu bezeichnen, stoppen echo und andere Funktionen, wenn sie auf ein Nullbyte stoßen (manchmal sagt das Handbuch, dass eine Funktion 'binärsicher' ist, was bedeutet, dass sie kein Nullbyte als betrachtet Schnurende).

Auch gibt es eine Menge von nicht-druckbare Zeichen. Sie haben normalerweise eine besondere Bedeutung (zum Beispiel das Zeichen 7 ist der "Glocke" -Befehl, tippe dies in deine Shell ein, um es auszuprobieren php -r 'echo "\7";').

Um herauszufinden, was in der Zeichenfolge ist, könnten Sie „convert“ jedes Zeichen in seine hexadezimale Darstellung. Sie können dafür bin2hex() verwenden, beachten Sie, dass es zwei Zeichen benötigt, um ein Zeichen der Eingabezeichenfolge darzustellen.

$ php -r 'var_dump(bin2hex(pack("i",6)));' 
string(8) "06000000" 

(Die Ausgabe, die Sie oben sehen, hängt von Ihrer Hardware). In meinem Fall pack('i', 6); die ganze Zahl in little-endian Format zurückgibt, da ich einen Intel-Prozessor haben.

Sie können sehen, dass das erste Zeichen (06) den Dezimalwert 6 hat. Was Sie dann tun, ist in der Regel nachzuschauen, zu welchem ​​Zeichen das gehört. In vielen Fällen ist es in Ordnung, eine ASCII-Tabelle zu verwenden. Beachten Sie jedoch, dass bestimmte Zeichen eine andere Bedeutung haben können, wenn Sie Unicode oder eine andere Kodierung verwenden. Laut meiner ASCII-Tabelle ist es die ACK character. Es ist ein nicht druckbares Zeichen, es hat nur Kontrollfunktion.

Was erklärt werden bleibt, ist, warum dies 0 auf ganzzahlige übersetzt Glück, das ist sehr einfach. Lesen Sie die PHP-Handbuchseite unter casting strings to numbers.

Wenn die Zeichenfolge mit gültigen numerischen Daten beginnen, wird dies der Wert verwendet werden. Andernfalls wird der Wert 0 (Null) sein.

Da die \6 char ist weder ein Zeichen noch eine Ziffer (die Zeichen 0-9 sind dezimal \48-\57 oder \0x30 - \0x39 hexadezimal) PHP gibt Null zurück.

+2

+1 Hervorragende Erklärung. – deceze