TE999
31. Mai 2020 um 10:34
1
Hallo,
ich hänge seit gestern an der Zerlegung eines Eingangsstrings HEX Länge 16 byte und benötige einmal etwas Input.
Der Eingabe sieht folgendermassen aus:
Ich habe es schon mit ord($data ); versucht Aber damit bekommt man ja nur die Information von 1Byte.
Wie kann ich aus den Eingabe Länge 16 Byte 0-3 = Kennung und Byte 3-5 = Dezimale Zahl extraieren?
Als Ergebniss müsste für Zeile 1 = 15673379 (dez.) , Zeile 2 = 1234 (dez.) und Zeile 3 = 0 (dez.) herrauskommen.
Wer kann mir weiterhelfen?
Thomas
Attain
31. Mai 2020 um 11:07
2
Hallo Thomas,
probier es mal so:
$result = ord($_IPS['VALUE']{5}) + 256 * ord($_IPS['VALUE']{4}) + 65.536 * ord($_IPS['VALUE']{3});
Gruß
Attain
1007
31. Mai 2020 um 11:07
3
Hallo
Auf die Schnelle so:
// String erstellen
$data = chr(165).chr(1).chr(26).chr(239).chr(40).chr(35);
$d3 = ord($data[3]);
$d4 = ord($data[4]);
$d5 = ord($data[5]);
$zahl = ($d3*65536)+($d4*256)+($d5);
echo "
Zahl:" . $zahl;
tommi
31. Mai 2020 um 11:12
4
Suche in der PHP Doku und finde dort die Funktionen „substr“ zum zerlegen und „hexdec“ zum konvertieren
<?php
$DATA=array("A5011AEF2823","A5011A0004D2","A5011A000000");
foreach ($DATA as $line) {
$kennung=substr($line,0,6);
$wert=substr($line,6,6);
$value=hexdec($wert);
print "$wert,$value
";
}
Das array ist nur zur Demonstration, bei Dir kommen ja schon die Werte wie in $line
Tommi
TE999
31. Mai 2020 um 11:27
5
Hallo,
es klappt. Danke für die Hilfe.
if ($_IPS['SENDER'] == "RegisterVariable")
{
// neu empfangene Daten lesen
$data = $_IPS['VALUE'];
$byte3=ord($data[3]);
$byte4=ord($data[4]);
$byte5=ord($data[5]);
$code = ($byte3*65536)+($byte4*256)+($byte5);
//print_r($code);
setvalue(51565,$code);
}
Schöne Pfingsten
Ergänzung:
Hexdec geht aber nicht mit binären Daten, sondern nur mit einem String welcher die hexadezimal Schreibweise enthält.
Anstatt mit ord funktioniert auch unpack.
Dies kann auch mit mehreren Bytes umgehen.
Michael