Umwandlung von Datum und Zeit Hexstring

Hallo,

ich habe ein Verständnisproblem bei der Umwandlung eines Hexstrings welcher Datum und Uhrzeitinfos beinhaltet. Der Variablentyp soll 32bit sein :nerd_face:
Die Umwandlung von Stunden, Minuten und Monat „scheint“ einfach. Der Tag ist gefrickel, das Jahr mir völlig unklar. Leider habe ich auch keine gescheite MBUS-Doku zum Aufbau des Datums gefunden.

Anbei mein Script mit Beispieldaten und ersten Umrechnungen - es wäre schön wenn ein Experte sich dies mal anschauen könnte.

<?php
//Beispielwerte
$valHex="046D230AAE2B"; $uebersetzt="14.11.2021 10:35";
test ($uebersetzt,$valHex);
$valHex="046D2F13BB2C"; $uebersetzt="27.12.2021 19:47";
test ($uebersetzt,$valHex);
$valHex="046D040ABE2C"; $uebersetzt="30.12.2021 10:04";
test ($uebersetzt,$valHex);
$valHex="046D1F03BE2C"; $uebersetzt="30.12.2021 03:31";
test ($uebersetzt,$valHex);
$valHex="046D0613BD2C"; $uebersetzt="29.12.2021 19:06";
test ($uebersetzt,$valHex);
$valHex="046d2d16bf2c"; $uebersetzt="31.12.2021 22:43";
test ($uebersetzt,$valHex);
$valHex="046d3508c121"; $uebersetzt="01.01.2022 08:53";
test ($uebersetzt,$valHex);
$valHex="046d100fc121"; $uebersetzt="01.01.2022 15:16";
test ($uebersetzt,$valHex);
$valHex="046d3309c221"; $uebersetzt="02.01.2022 09:51";
test ($uebersetzt,$valHex);
//
function test ($uebersetzt,$valHex) {
    $dataArr = str_split($valHex, 1);
    echo "\n".$uebersetzt;
    //Stunde und Minute und Monat funktionieren einfach
    $Stunde=hexdec($dataArr[6].$dataArr[7]);    echo "\tUhrzeit=$Stunde:";
    $Minute=hexdec($dataArr[4].$dataArr[5]);    echo $Minute;  
    $Monat=hexdec($dataArr[11]);    echo "\tMonat=$Monat";                    
    //Tag wird gebildet aus 2zeichen
    $Tag=hexdec($dataArr[8]);    //($dataArr[8]) erster Teil von Tag 0*16 oder 1*16 + zweiter teil von Tag
    $Tag1=str_split($Tag, 1);    
    $Tag2=hexdec($dataArr[9]);   
    if ($Tag1[1]==1) {                                  //das ist verrückt zum 01.01. hat sich statt erwartet der Wert wieder auf 0 leider auf 2 erhöht
            $TagFinal=($Tag1[1]*16)+($Tag2);            echo "\t Tag(16):$TagFinal"; 
    }
    else {
        $TagFinal=($Tag2);    echo "\t Tag:$TagFinal";
    }
    //das Jahr ist mir völlig unklar
    return;
}
?>

Ciao
HerbertF

Ich habe das mal etwas aufgeräumt, hilft mir bei der Übersicht. Vielleicht auch Anderen.

//             M  H  Tag Mon
$valHex="04 6D 23 0A AE 2B"; $uebersetzt="14.11.2021 10:35";
$valHex="04 6D 2F 13 BB 2C"; $uebersetzt="27.12.2021 19:47";
$valHex="04 6D 06 13 BD 2C"; $uebersetzt="29.12.2021 19:06";
$valHex="04 6D 04 0A BE 2C"; $uebersetzt="30.12.2021 10:04";
$valHex="04 6D 1F 03 BE 2C"; $uebersetzt="30.12.2021 03:31";
$valHex="04 6d 2d 16 bf 2c"; $uebersetzt="31.12.2021 22:43";
$valHex="04 6d 35 08 c1 21"; $uebersetzt="01.01.2022 08:53";
$valHex="04 6d 10 0f c1 21"; $uebersetzt="01.01.2022 15:16";
$valHex="04 6d 33 09 c2 21"; $uebersetzt="02.01.2022 09:51";

Ich vermute das Jahr ist teilcodiert mit dem Tag. Für den Tag benötigt man maximal 31 Werte. Diese können mit 5bit dargestellt werden. Wir haben aber 8 bit zur Verfügung. Mit dem Jahreswechsel ist die obere Hälfte (in deiner Zählung Position 8) des Bytes von B auf C umgesprungen.

Ich kann Grundsätzlich empfehlen, die Darstellung auf Binär umzustellen und die Unterschiede im Binärteil zu suchen.

Hallo
Hab die Codierung hier gefunden:


Nur mal auf die Schnelle. Jahr ist ein bisschen hin und hergeschiebe.

function test2($valhex)
    {

    $DIF =  substr($valhex,0,2);
    echo "\nDIF:". $DIF;
    $VIF =  substr($valhex,2,2);
    echo "\nVIF:". $VIF;
    $Byte1 =  substr($valhex,4,2);
    echo "\nMinute:".$Byte1;
    $minute = hexdec($Byte1);
    echo " - " .$minute;
    $Byte2 =  substr($valhex,6,2);
    echo "\nStunde:".$Byte2;
    $stunde = hexdec($Byte2);
    echo " - " .$stunde;
   
    $Byte3 =  substr($valhex,8,2);
    $tag = hexdec($Byte3);
    $tag = $tag & 15;
    echo "\nTag:".$Byte3 ." - ".$tag;

    $Byte4 =  substr($valhex,10,2);
    $monat = hexdec($Byte4);
    $monat =  $monat & 15;
    echo "\nMonat:".$Byte4 . " - " . $monat;

    $jahr1 = hexdec($Byte3);
    $jahr1 = ($jahr1 & 224)/32 ;
    echo "\nJahr1:". $jahr1;
    $jahr2 = hexdec($Byte4);
    $jahr2 = ($jahr2 & 240)/2;
    echo "\nJahr2:". $jahr2;
    echo "\nJahr gesamt:" . ($jahr1 + $jahr2);

    }


Gibt das :

DIF:04
VIF:6d
Minute:33 - 51
Stunde:09 - 9
Tag:c2 - 2
Monat:21 - 1
Jahr1:6
Jahr2:16
Jahr gesamt:22
1 „Gefällt mir“

Hi,

ihr seid ja so schnell - es ist ein Traum :heart_eyes:

Besten Dank euch beiden,
@1007: funktioniert Klasse.

Ich wünsche euch weiterhin ein gesundes und glückliches Jahr 2022 - auch ohne hexdec :sweat_smile:

Ciao
HerbertF