AnsiString mit HexInhalt in Zahl wandeln



  • Ich hab einen AnsiString welcher einen Hexadezimalen Wert als Inhalt hat. Nun habe ich in meiner VCL -Hilfe gesucht obs da irgendwas gibt das in eine Type int oder so zu wandeln aber nix gefunden.
    Habe mir jetzt was passendes selber gebastelt, möchte aber trotzdem noch gerne wissen obs das nicht doch schon gibt.



  • Da gibts nix in der VCL, aber ich hab mir da vor längerer Zeit mal was zusammengeklimpert:

    int HexToInt(AnsiString src)
    {
        if(src.SubString(1, 2) != "0x" && src.SubString(1, 2) != "0X")
            src.Insert("0x", 1);
        return strtol(src.c_str(), NULL, 16);
    }
    


  • Eßer:
    Hinweis am Rande: mit UpperCase() und Pos() kannst du deine if-Abfrage noch etwas optimieren.



  • Ich hab mal n bisschen rumprobiert:

    UpperCase macht das ganze wirklich etwas schneller. Allerdings ist SubString immer noch schneller als Pos.

    Hier also die neue Version:

    int HexToInt(AnsiString src)
    {
        if(UpperCase(src).SubString(1, 2) != "0X")
            src.Insert("0x", 1);
        return strtol(src.c_str(), NULL, 16);
    }
    


  • Eßer schrieb:

    Allerdings ist SubString immer noch schneller als Pos.

    wie hast du das denn getestet? Davon abgesehen ging es mir bei der "Optimierung" nicht um Performanceunterschiede sondern um Stil und Aufwand beim Schreiben. 😉



  • Ich werd jetzt ja mit Lösungen richtig verwöhnt.
    Wart ich brauch mal gerade eben noch neFunktion für .... 😃



  • Oder einfacher:

    int IWert = StrToInt("0xFF");
    


  • Jansen schrieb:

    Eßer schrieb:

    Allerdings ist SubString immer noch schneller als Pos.

    wie hast du das denn getestet?

    QueryPerformanceCounter()

    Ich hab aber gerade festgetsellt, dass die Funktion gar keine Vorzeichen unterstüzt, hier also nochmal eine aktualisierte Version:

    int HexToInt(AnsiString src)
    {
        int SignPos = (src[1] == '+') || (src[1] == '-') ? 1 : 0;  //Ist ein Vorzeichen vorhanden?
        if(UpperCase(src).SubString(SignPos + 1, 2) == "0X")
            src.Insert("0x", SignPos + 1);
        return strtol(src.c_str(), NULL, 16);
    }
    


  • Dank des Split-Features des neuen Boards geht die Performance-Diskussion hier weiter.



  • So, hier nochmal eine aktualisierte Version:

    int HexToInt(AnsiString src)
    {
        if ((src[1] == '+') || (src[1] == '-'))           //Ist ein Vorzeichen vorhanden?
            src.Insert("+", 1);
    
        if(UpperCase(src).Pos("0X") != 2)                 //richtiges Format?
            src.Insert("0x", 2);
    
        return strtol(src.c_str(), NULL, 16);
    }
    

Anmelden zum Antworten