Probleme bei Subtraktion von Hex..

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Probleme bei Subtraktion von Hex..

    PHP-Code:
    $var1 "0x".substr $str1,  0,  );
    $var2 "0x".substr $str2,  0,  );
    echo 
    dechex($var1-$var2); 
    Ergebnis ist: f83fa0a7
    Ergebnis sollte aber sein: 83FA0A67

    Wie man sieht wird meinem Ergebnis ein F vorgeschoben und die Stelle wir gerundet. (das sagen mehre Testwerte)

    Woran kann das liegen?

    EDIT:
    Wertebereich für die Funkton dechex überschritten?
    Zuletzt geändert von uschi; 08.04.2006, 10:02.

  • #2
    $var1 = "0x".substr ( $str1, 0, 7 ); ??

    was tust du da?

    du kannst rechenoperatoren doch direkt auf hexzahlen anwenden.

    Kommentar


    • #3
      Wie du siehst extrahiere ich die Hex-Zahl aus einem String. (der aus der Datenbank kommt)

      Kommentar


      • #4
        $zeig $doch $mal $die $strings.
        Mir sieht das nach einer Stellenverschiebung aus.

        Kommentar


        • #5
          Was gibt es mit substr($str1,0,8) und substr ($str2,0,8)?

          Kommentar


          • #6
            Die strings:

            PHP-Code:
            $str1 "51aa43837170cfa1ce";
            $str2 "9cd5ea42c6c9032a1d"
            ich bin langsam echt am verzweifeln..

            Kommentar


            • #7
              Original geschrieben von miximaxi
              Was gibt es mit substr($str1,0,8) und substr ($str2,0,8)?
              Ein Zeichen mehr. ;-)

              Kommentar


              • #8
                Ein virtuelles Hilfscarry-Flag brachte das gewünschte Ergebnis. Trotsdem danke!

                Kommentar


                • #9
                  Uschi das Problem ist tatsächlich schwierig. In Windows hat folgendes Monster das richtige Resultat b4d45941 geliefert (Rechnen mit 16bit Werten, dabei ignoriert sich der Ueberlauf):

                  PHP-Code:
                  $str1 "51aa43837170cfa1ce"
                  $str2 "9cd5ea42c6c9032a1d"

                  $var1H intval (substr($str1,0,4),16 );
                  $var1L intval (substr($str1,4,4),16 );
                  $var2H intval  (substr($str2,0,4),16 );
                  $var2L intval  (substr($str2,4,4),16 );

                  $delta = ($var1H $var2H)*0x10000 + ($var1L-$var2L);
                  $res=dechex($delta);

                  echo 
                  "var1H=$var1H var1L=$var1L  var2H=$var2H var1L=$var2L delta=$delta res=$res"
                  Alles naheliegendere gab falsche Resultate:
                  Casting von hexstrings inkl 0x mit (int) oder intval gibt null.
                  Die Konversion von negativen 32bit Grössen (ohne 0x..) mit intval gibt maxint,
                  decval(7stellig - 7stellig) hat das richtige 7stellige Ergebnis geliefert. 0xfb4d4594
                  decval(8stellig - 8stellig) hat ein falsches 8stelliges Ergebnis geliefert: 0x51aa4383 (=$var1).

                  1. Nachtrag: vermutlich ist es übersichtlicher, mit einer Schleife über die Strings die Subtraktion von Hand zu machen, inkl. hexkonversion der Stellen dabei. Ausser es kennt jemand noch eine PHPFunktion die solches Longint Hex Zeugs kann.

                  2. Nachtrag: Zahlenkonversion so:
                  PHP-Code:
                  //$var1='0x'.substr($str1,0,8);
                  $var1H intval (substr($str1,0,4),16 );
                  $var1L intval (substr($str1,4,4),16 );
                  $var1=$var1H*0x10000+$var1L;

                  //$var2='0x'.substr($str2,0,8);
                  $var2H intval (substr($str2,0,4),16 );
                  $var2L intval (substr($str2,4,4),16 );
                  $var2=$var2H*0x10000+$var2L;
                  echo 
                  dechex($var1-$var2); 
                  Soll ich die Ansätze oben wieder löschen?
                  Zuletzt geändert von miximaxi; 09.04.2006, 00:43.

                  Kommentar


                  • #10
                    Öh danke. Ich hab das Problem bereits gelöst.
                    Nach 16 Bit muss im Low-Teil einfach das AC-Flag abgefragt werden und gegenfals eine Korrektur im High-Bereich durchgeführt werden, dann ist ein n-bit-Rechnen. (Können tausende sein, egal) möglich. Trotzdem danke!

                    Kommentar


                    • #11
                      Kannst Du auch deinen code posten, anstatt ihn rätselweise anzudeuten? (das wovon du schreibst gibt es in meinem php bisher nicht, deswegen nimmt es mich wunder)

                      Kommentar


                      • #12
                        Huhu, ich dachte du kannst dir das aus der Asm-Programmierung herleiten! Sry

                        PHP-Code:
                        # die Korrektur
                        # $i % 2 == 1 tritt ein, wenn auf den höherwertigen Teil des virtuellen 32 Bit-Registers gestoßen wird
                        # ac === true: logisch, HilfscarryFlag gesetzt
                        # Korrektur wie in Assembler (kenne das Problem so vom x85)
                        if ( $i == && $ac === true$result -= 0x1
                        den Hexstring bei der Subtraktion von hinten nach vorne durchiterieren! AC setzen, wenn nach der Subtraktion der niederwertigen Teile ein 32 Bit Wert entsteht (Hier sollte nur ein 16 Bit-Wert erscheinen, also 4 Zeichen) Die 16 Bit High sind nämlich FFFF, also der Übertrag, welcher die Korrektur erforderlich macht.

                        Kommentar


                        • #13
                          Original geschrieben von uschi
                          Huhu, ich dachte du kannst dir das aus der Asm-Programmierung herleiten! Sry

                          den Hexstring bei der Subtraktion von hinten nach vorne durchiterieren!
                          Kenn ich selbstverständlich, aber welchen der möglichen Wege Du gegangen bist,
                          nämlich den Iterationsweg, schreibst Du hier zum ersten mal. Das Iterieren steht
                          nicht im von Dir geposteten php, auch jetzt noch nicht. So ganz nebenbei
                          geben die von Dir in diesem thread angegebenen Werte von str1 und str2 auch
                          nicht das von Dir angegebene gewünschte Resultat, und die überflüssigen $F am
                          Anfang, und das Runden passen gut dazu, dass Du nur 7 anstatt 8 Stellen
                          gerechnet hast. Bei meiner Rechenweise braucht es übrigens kein Carry.


                          Soviel zu deiner verwirrten Frage-Stellung. Wie oftmals ist die Frage wichtiger als
                          die Antwort, nämlich dass (int) und intval aus negativen stringcodierten 32bit
                          Werten (0x8000 0000 und mehr) nichts gutes machen, dh (int) macht sogar aus
                          allen stringcodierten hexwerten nichts.
                          Zuletzt geändert von miximaxi; 09.04.2006, 18:27.

                          Kommentar

                          Lädt...
                          X