2016-04-03 5 views
1

Warum pack() gibt das gleiche Ergebnis für vorzeichenbehaftete und unsignierte Formatcodes?PHP-Pack-Funktion

http://php.net/manual/en/function.pack.php

Beachten Sie, dass die Unterscheidung zwischen mit und ohne Vorzeichen Werte nur die Funktion auspacken beeinflusst(), wobei als Funktion pack() für signierte und unsignierte Format-Codes das gleiche Ergebnis gibt.

+3

Weil es auf diese Weise implementiert ist? –

+0

@AlexBlex warum? Ich möchte eine signierte Ganzzahl packen, um sie an eine API zu senden. Ist das wichtig? vielleicht entpackt der API-Server es falsch. – Cooper

Antwort

2

Die gepackte Ganzzahl ist ein 32/64 Bit dword/qword, das keine Information enthält, ob es Ganzzahl mit Vorzeichen ist oder nicht. Die Interpretation des höchsten Bits erfolgt nur beim Entpacken.

Ich empfehle dringend, die Dokumentation für den API-Server in Bezug auf Datenformat zu überprüfen. Neben der Interpretation des Sing-Bits sollte die Länge der ganzen Zahlen und byte order erwähnt werden.

Auch lesen Sie bitte

Vorsicht Beachten Sie, dass PHP intern Integer-Werte als signierte Werte einer maschinenabhängigen Größe (C Typ long) speichert ....

Teil die Seite, auf die Sie sich bezogen haben.

Bei der Arbeit mit binären Daten liegt es in Ihrer Verantwortung, eine korrekte Verpackung sicherzustellen. I.e. Wenn API-Server Signed 32int erwartet, sollten Sie sicherstellen, dass die Ganzzahl, die Sie senden, nicht mehr als 2.147.483.647 (0x7FFF FFFF) ist, andernfalls wird es als negative Zahl interpretiert; und umgekehrt, wenn API-Server erwartet unsigned int32, ist es egal, wie hart Sie wollen, um eine vorzeichenbehaftete Ganzzahl zu packen - das Ergebnis wird als eine positive Zahl entpackt werden.