Module: pack

Hallo,

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

 $this->SendDataToParent(json_encode(Array("DataID" => "{B87AC955-F258-468B-92FE-F4E0866A9E18}", "Buffer" => $Text)));

laufen zu lassen bekomme aber eine parser Error.
Jemand eine Idee wie ich das an das Geraet uebergebe?

Gruss
MiniBlister

Das sieht doch gut aus. Hast du mal die genaue Meldung? Wo ist die zu sehen?

paresy

Hab eine Testfunktion angelegt um das parsen zu testen welche ich vom Gereat aufrufe.

Mach mal ein utf8encode auf $Text.
Michael

Hast du $Text korrekt per utf8_encode kodiert?

paresy

Danke fuer die schnelle hilfe.
Wenn ich ueber:

	$msg = pack('N*',3004);
	CSCK_SendText($id, $msg);
	$msg = pack('N*',0);
	CSCK_SendText($id, $msg);

laufen lasse kommt bei Debug der Schnittstelle folgendes an:
TRANSMIT 00 00 0B BC
TRANSMIT 00 00 00 00

Wenn ich das ueber:

$Text = pack('N*',3004);
                $Text = utf8_decode($Text);
                        
                $this->SendDataToParent(json_encode(Array("DataID" => "{B87AC955-F258-468B-92FE-F4E0866A9E18}", "Buffer" => $Text)));
                $Text = pack('N*',0);
                $Text = utf8_decode($Text);
                        
                $this->SendDataToParent(json_encode(Array("DataID" => "{B87AC955-F258-468B-92FE-F4E0866A9E18}", "Buffer" => $Text)));

laufen lasse kommt:
TRANSMIT 00 00 0B 3F
TRANSMIT 00 00 00 00
an

komisch.

Encode nicht decode… Verwechsel ich aber auch immer.
Michael
PS: Ich habe es mal in den Modul-Bereich verschoben.

geht, danke…komm mit dem Modul weiter

Hallo,

ich habe meine System nun von einer Windows Maschine auf ein Linux system gepackt und habe derzeit ein Problem mit

$d = unpack("N*",$data);

Ich bekomme keine negativen Zahlen mehr.
Statt -2 bekomme ich 4294967294

Ich denke das liegt wohl an der 32bit vs 64bit Version.
Jemand eine Idee wie ich das verarbeite?

Danke
MiniBlsiter

Nimm Mal das * weg.
Michael

$DATA ist eine ganze Kette aus Hex Daten und ich versuche die mit dem * in einzelne Blöcke zu teilen. Daher geht es mit N ohne * wohl nicht, oder?

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.

Michael

Nein das Ergebnis -2 ist richtig.


00 00 0B BC 00 00 00 00 00 00 00 C8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 1A 00 00 01 18 00 00 00 FC 00 00 
00 F7 00 00 01 0C FF FF FF FE 00 00 00 02 00 00 01 7E 00 00 01 C2 00 00 00 DA

Der rot markierte teil soll -2 ergeben (dann muss ich die Zahl noch durch 10 teilen und bekomme -0.2 C = derzeitige Aussentemperatur)

Wie gesagt auf dem Windows Maschine ging das immer gut aber auf der Linux Maschine bekomme ich als Ergebnis: 4294967294

Kann ich das irgendwie maskieren?

Nein minus 2 war schon immer falsch :wink:
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);

Michael