PHP Funktion pack/unpack

Hallo Leute,

das Skript:

$Test = pack("C*", "Test");
print_r(unpack("C*", $Test));

…führt zu der Ausgabe:

Array ( [1] => 0 ) 

Soll das so sein? Sollte da nicht die Bytes des Wortes „Test“ erscheinen?

Joachim

Es reicht den String direkt anzugeben.

print_r(unpack("C*", "Test"))

Gruß,

Toni

Hallo Toni,

ich möchte einen Befehl über einen Client Socket senden. Dazu ist eine bestimmte Struktur erforderlich. Bisher waren nur Zahlen zu senden, das geht ohne Probleme.
Im Ganzen sollte es so sein:

$Device = "/dev/ttyAMA0";
 $message = pack("L*", 76, 38400, 0, strlen($Device), $Device);

Weil das nicht zum Erfolg führte habe ich im nächsten Schritt mal testweise geschaut, was den so „gepackt“ wurde.
Dabei ist mir aufgefallen, dass scheinbar der String „$Device“ als 0 ausgegeben wird (das unpack Array ist 76,38400, 0, 13, 0). Das lässt zumindest vermuten, warum der Befehl nicht korrekt ausgeführt wird.
Möglicherweise liegt hier also der Hund begraben. Offenbar ist eine Stringzuweisung hier so nicht möglich.

Doch wie macht man sie korrekt?

Joachim

Knifflig… :smiley:

Triffts das in etwa?

// Rin
$Device="/dev/ttyAMA0";
$DeviceBytes = unpack("C*", $Device);
$Values=array_merge(array(76, 38400, 0, strlen($Device)), $DeviceBytes);
$message=call_user_func_array("pack", array_merge(array("L*"), $Values));

// Rut
$Result = unpack("L*", $message);
print_r($Result);

Hallo Toni,

ich kann es leider jetzt nicht „live“ ausprobieren (nur den Code selbst), aber ich meine es dürften im Ergebnis nur 7 Werte im Array sein :
Wert 1: 76
Wert 2: 38400
Wert 3: 0
Wert 4: 12 (Anzahl der nachfolgenden Bytes)
Wert 5: die ersten 4 Zeichen
Wert 6: die zweiten 4 Zeichen
Wert 7: die dritten 4 Zeichen
(Wert 5-7 weil mit „L“ auf 16 Bit „gepackt“)
Bin aber total unsicher…:confused:

Joachim

…inspiriert von Deinem Ansatz habe ich es jetzt mal so probiert:

$message = pack("L*", 76, 38400, 0, strlen($Device), pack("C*", $Device));

kommt aber auch zu dem Ergebnis:

Array
(
    [1] => 76
    [2] => 38400
    [3] => 0
    [4] => 12
    [5] => 0
)

Joachim

Nachtrag: Bei Deinem Ansatz antwortet der Server! Leider mit der Fehlermeldung „PI_BAD_SER_DEVICE =-79“…
Gesendet werden soll das Device als uint8_t device

…so funktioniert es:

$Device = "/dev/ttyAMA0";
$message = pack("L*", 76, 38400, 0, strlen($Device)).$Device;

…manchmal denkt man halt viel zu kompliziert!:slight_smile:

Joachim

Cool, dass es geklappt hat :slight_smile: