ich versuche ein Modul fuer die Novelan/Alpha Innotec zu entwicklen. Ich hatte das ganze schon mit Scripten in meinem IPS drin und moechte es gerne auch anderen zu Verfuegung stellen.
Um eine Request an das Geraet Novelan zu schicken hatte ich in der Vergangeheit folgendes verwendet.
$Text = pack(‚N*‘,3004);
CSCK_SendText($id, $msg);
Was auch toll funktioniert hat.
Ich versuche nun das ganze ueber ein Splitter und
Sorry, hatte da gestern etwas falsch gelesen.
Das Ergebnis -2 war schon immer falsch, und entstand durch den Überlauf der 32Bit-Zahl.
N ist soll aber immer vorzeichenlos sein. Also immer positiv.
Somit ist der Wert unter 64Bit-Systemen korrekt und unter 32Bit-Systemen falsch.
Das ein pack mit -2 funktioniert, liegt daran, dass pack das Vorzeichen nicht beachtet.
PHP-Doku:
Beachten sie, dass der Unterschied zwischen vorzeichenlosen und vorzeichenbehafteten Werten nur Einfluss auf die Funktion unpack() hat, wogegen die Funktion pack() bei vorzeichenlosen und vorzeichenbehafteten Format-Codes dasselbe Ergebnis liefert.
Nein minus 2 war schon immer falsch
Unpack N soll immer vorzeichenlose Zahlen liefern.
Auch wenn du -2 erhalten willst, so hast du vorher einen Effekt bei 32Bit ausgenutzt.
IPS 64Bit für Windows kommt auch 4294967294 raus, unter Ubuntu 64 auch.
Unter Pi, SymBox und MacOs habe ich nicht getestet.
Einfachste Idee ist auf PHP_INT_SIZE zu prüfen (größer 4) und dann den Überlauf abzuziehen.
$var =--2;
$var2= pack("N",$var);
echo bin2hex($var2).PHP_EOL;
$var3= unpack("N",$var2)[1];
var_dump($var3);
if ((PHP_INT_SIZE >4) and ($var3 > 4294967294))
var_dump($var3-4294967296);