HEX-String to Int (od. short)



  • Hallo zusammen,

    ich muss einen HexString in eine zahl umwandeln, also z.B. "A"=10.
    Ich versuchte das so zu machen:

    short Tools::HexStringToShort (AnsiString Hex_AS)
    {
      short Shorti;
      std::istringstream Str(Hex_AS.c_str());
      Str >> std::hex >> Shorti;
      return Shorti;
    }
    

    Jetzt hab' ich aber das Problem, dass die Funktion einfach 4098 zurückliefert wenn ich z.B. "zz" als String übergebe.. Warum ist das so? Kann ich das irgendwie umgehen? Danke!



  • Dafür gibt's doch die Funktion StrToInt().
    Was man dabei beachten muß: Der Hex-String muß mit "0x" beginnen.
    Also: "ABCD" -> "0xABCD"

    Gruß,

    Alexander



  • Hm, okay ich hab's jetzt mal so versucht:

    Memo1->Lines->Add(StrToInt(("0x"+((test.SubString(17,5)).Delete(3,1)))) +" ...");
    

    und das ist rausgekommen: "@s" statt 512... Warum bloss?



  • Mal abgesehen davon, dass man auf so unübersichtliche, verschachtelte Operationen verzichten sollte, wird es vermutlich nötig sein, dass du den erhaltenen Int wieder in einen AnsiString (mittels temporärem Objekt wie "AnsiString(<intvariable>)") zu konvertieren. Wundert mich eigentlich, dass der Compiler sich nicht über eine ungültige Zeigeraddition beschwert hat...

    -junix



  • roN schrieb:

    und das ist rausgekommen: "@s" statt 512... Warum bloss?

    Ja warum bloß?

    Hast Du mit dem Debugger mal überprüft, was überhaupt in dem Stringsalat den Du durch diese AnsiString-Operationen produzierst raus kommt? Steht in "test" überhaupt ein gültiger HEX-Wert?

    Nochmal ein Beispiel zur HEX-Konvertierung zum mitmeißeln:

    int IWert = StrToInt("0xFF");
    

    Außerdem, warum fügst Du die Variable "test" nicht gleich so in den Memofeld ein, wie sie ist, nämlich als String? Warum willst Du sie mit StrToInt unbedingt nochmal nach Int konvertieren?



  • Und außerem: Was machst du, wenn schon "0x" davor stand? Da kannst du nicht einfach nochmal "0x" davorsetzen. Ich würd das so machen:

    int HexToInt(String Hex)
    {
       if (Hex.SubString(1,2).UpperCase()!="0X")
          Hex="0x"+Hex;   // Wenn "0x" nicht gefunden, wird es eben davor gesetzt
       for (int i=3;i<=Hex.Length();i++)
          if (!('F'>=Hex.UpperCase()[i] && Hex[i]>='0'))
             return -1;   // Wenn eines der Zeichen (nach "0x") ungültig ist, gibt die Funktion -1 zurück.
       return StrToInt(Hex);   // Ansonsten den Int-Wert.
    }
    

    Ist vielleicht nicht die kürzeste Lösung aber dafür eine sichere, die -1 zurückgibt, wenn es sich nicht um einen gültigen Hex-String handelt.



  • Windoof schrieb:

    <snip>

    Okay, hab' das so gemacht, und was kann ich machen wenn der Wert signed sein soll, d.h. z.B. 0xFA == -6 und != 250...wie mach ich das?
    Danke!

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • roN schrieb:

    (...) und was kann ich machen wenn der Wert signed sein soll, d.h. z.B. 0xFA == -6 und != 250...wie mach ich das?

    Ich habe das mal eben ausprobiert und so hat es bei mir funktioniert.

    iVal = StrToInt("0xFA");
       signed char cVal = 0x0; // Alle Bits auf 0 setzen
       cVal = cVal | iVal; // Durch Verodern die Bits von der int-Variable übertragen
    

    Anstatt -1 zurückzugeben solltest Du dann allerdings lieber einen Fehler bringen.

    Gruß,

    Alexander


Log in to reply