Hilfe bei Hex -> Binär gesucht

Guten Morgen

Da ich aktuell Urlaub und somit wieder Zeit zum Basteln habe, versuche ich ein wenig mit dem Buderus EMS Gateway herumzuspielen.

Es kommen Hexwerte an, die 8 Datenbits abbilden. Mit base_convert() kann ich zwar in Binär umwandeln, aber wenn als Hexwert „04“ an kommt, dann kommt als Ergebnis: 100
Gibt es eine Möglichkeit diesen Wert auch komplett abzubilden, also: 00000100 ??
(In dem Beispiel ist das 3. Bit gesetzt und bedeutet das die Automatik an ist.)

Ziel ist es eigentlich nur, die Bits auszuwerten um sie den einzelnen Variablen zuordnen zu können.
Hat jemand eine Idee wie man das unkompliziert umsetzen kann ?

Gruß
Jens

Hallo,

hab mir da mal eine Funktion gebastelt:


function CS_hex2bin($str) {
    $build = '';
    $build = decbin(hexdec($str));
    $build = str_pad($build, 8,0, STR_PAD_LEFT);
    return $build;
}

echo CS_hex2bin(04);

Ergebnis lautet:
00000100

hoffe du meintest soetwas!

lg,
Christian.

Hier stand Mist!

Hallo Christian,

vielen Dank.
An so etwas hatte ich zuerst auch schon gedacht, war mir aber nicht sicher ob das zielführend ist.
Die Hoffnung war etwas geniales zu finden, mit dem auch gleichzeitig die Variablen gefüllt werden können. Aber so kann ich jetzt zumindest schon mal die einzelnen Stellen auswerten. :slight_smile:

Gruß
Jens

Hi Jens,

du kannst du doch mit der Funktion mit 2 Zeilen das umwandeln und direkt in eine Variable speichern oder sonstwas damit anstellen. Einfacher geht doch nicht!? :slight_smile: Oder was hast du dir genau vorgestellt? Dann musst du etwas genauer werden :slight_smile:

@Christian: Danke für die Funktion, brauche die zwar aktuell nicht, aber irgendwann bestimmt mal - also gespeichert :smiley:

Grüße,
Chris

Hey Chris,

wie schon gesagt ist der Hexwert die Zusammenfassung von 8 Einzelwerten und somit der Zustand von 8 Variablen.
Wie lautet der Zweizeiler um alle 8 Variablen zu aktualisieren ? :wink:

:smiley:

Ich kenne dein komplettes Skript nicht, denn du hast es nicht geposted, obwohl es immer hilfreich wäre das Skript des Fragestellers zu kennen… :smiley: :stuck_out_tongue:
…aber du musst ja zwangsweise immer mal eine Zeile haben wo du deine jetzigen Variablen/Werte „anfasst“…!?
…jage sie doch da direkt durch die Funktion und schon haste es umgerechnet und kannst weitermachen wie bisher, nur in binär?!

Grüße,
Chris

?? Wo steht etwas von einem existierenden Script?
Bisher gibt es kein Script, daher habe ich auch keins gepostet !?

Was bislang existiert ist ein Hexwert, den ich mit base_convert() in Binär umrechne, siehe Beispiele im Startpost.
Mit der Funktion von Christian wird das Ergebnis lediglich mit Nullen auf gesamt 8 Stellen aufgefüllt.
Somit habe ich wie bisher eine Variable mit einem Stringwert … Am einfachsten wäre jetzt sicher etwas wie explode(), aber das geht ja auf Grund fehlendem Trennzeichen nicht. Daher die Frage nach einer Idee hier im Forum.

Aber ich habs jetzt selbst gelöst.

$status_var1=str_split(str_pad(base_convert($hexwert, 16, 2),8,0, STR_PAD_LEFT),1);

Zur Erklärung:
base_convert wandelt den ursprünglichen $hexwert in Binär um.
str_pad() füllt bei Bedarf den Binärwert von links mit Nullen auf insgesamt 8 Stellen auf.
str_split() zerlegt dann den Binärwert nach jeder Stelle und macht daraus ein Array

Gruß
Jens

Ist ja nur eine Zeile, nicht mal 2 :smiley: :wink: :stuck_out_tongue:

Naja, es kommen dann noch 8 Zeilen dazu, um die einzelnen Arraywerte den Variablen zuzuweisen, oder geht das doch noch eleganter ? :wink:

Du könntest es mit einer for-Schleife kürzer halten, wenn du darin die Variablen füllst :smiley:

Aber ob nun 9 oder ~5 Zeilen ist wohl egal :smiley:

Wie sieht den der Eingangswert aus ?
String Hex-Codiert ? Oder direkt eine Zahl ?
Hier ein 7-Zeiler für 8 Variablen (eine Pro Bit).


<?
// 8x IPS-Variabel Typ bool
$vars = array(23543,43643,21346,43522,52435,87338,12340,32140);
$value = 0xA2; // zu Prüfender Hex-Wert / Integer $value = hexdec("A2"); // Wenn Wert Hex-String ist
foreach ($vars as $key=>$var)
{
	if (($value & pow(2,$key)) == pow(2,$key)) SetValueBoolean($var,true);
	else SetValueBoolean($var,false);
}
?>

Michael

Ein Hexwert als String

Dann muss bei meinem Beispiel vorher noch hexdec den String in einen Integer wandeln.
Michael
Edit: Habe das oben mal angefügt.

ok, danke … schaue ich mir die Tage mal an!

:loveips::slight_smile:

Hehe, ich mag das IPS Forum :slight_smile: Viele coole Leute hier unterwegs :cool: :smiley: Gutes Skript Michael, so meinte ich das :slight_smile:

Aber…tetrapack…man muss auch bedenken, dass kürzer nicht immer gleich besser ist :wink: :smiley:

> Wichtig ist doch eigentlich die Laufzeit des Skriptes!? Also kann unter umständen ein Skript mit 20 Zeilen schneller sein als ein Skript mit 7 Zeilen. Wenn du also extremen Wert auf Schnelligkeit legst, dann kannst du ja mal die Zeit des Skriptes messen und die kurze Variante von Michael mit einer langen Variante mit einzelner Variablenprüfung ohne for oder mit Funktion oder wie auch immer gegenüberstellen :cool:

Beispiel:

<?
$beginn = microtime(true);

// IPS_Sleep(2000);
// irgendwelche Befehle von denen man die Zeit stoppen möchte

$dauer = microtime(true) - $beginn;
echo "Skript-Laufzeit: ".$dauer." Sekunden!";
?>

Grüße,
Chris

Es gibt eine einfache Möglichkeit indem du deinen hex Wert mit dem hex Wert für jedes Bit logisch UND verknüpfst. Da gab es hier im Forum mal eine Variante mit INT um aus einem Siemens ausgangsbyte die Zustände der Bits auf Variablen zu schreiben. Ist die UND Verknüpfung größer 0 ist das Bit gesetzt. Ich bin grad nicht am PC aber wenn Interesse besteht poste ich mal meinen Ansatz.

Das macht doch mein script …
Binäre Operanden können auch auf Int angewendet werden.
Michael

Stimmt, so ähnlich hab ich das auch. Wurde im Tapatalk nicht ganz dargestellt.