Wie analysiere ich Hex-Werte in eine Uint?

73
uint color; 
bool parsedhex = uint.TryParse(TextBox1.Text, out color); 
//where Text is of the form 0xFF0000
if(parsedhex)
   //...

funktioniert nicht Was mache ich falsch?

Cameron A. Ellis
quelle

Antworten:

119

Versuchen

Convert.ToUInt32(hex, 16)  //Using ToUInt32 not ToUInt64, as per OP comment
Nescio
quelle
5
Beachten Sie Folgendes (obwohl dies möglicherweise nicht für diese bestimmte Ganzzahlkonvertierung gilt) ... Wenn die Eingabe schlecht ist, kann Convert.ToUInt32 um Größenordnungen langsamer sein als UInt32.TryParse, wie Convert.ToDouble vs Double.TryParse: stackoverflow .com / question / 586436 /… Außerdem ist nicht immer klar, was konvertiert wird: stackoverflow.com/questions/586436/…
Triynko
1
Wie @Triynko sagte, ist dies ein fehlerhafter Prozess, da er Ausnahmen auslösen kann. uint.TryParse wäre vorzuziehen, da es einen booleschen Wert zurückgibt, der Erfolg oder Misserfolg anzeigt, anstatt eine Ausnahme auszulösen.
Zenexer
1
Bei diesem Ansatz mit Convert.ToUInt32wird das Präfix '0x' als Teil der Eingabe behandelt.
Derek W
47

Sie können eine Überladung verwenden, TryParse()die dem TryParseAufruf einen NumberStyle-Parameter hinzufügt, der das Parsen von Hexadezimalwerten ermöglicht. Verwenden Sie NumberStyles.HexNumberdiese Option, um die Zeichenfolge als Hex-Zahl zu übergeben.

Hinweis : Das Problem mit NumberStyles.HexNumberist , dass es nicht funktioniert unterstützen Werte mit einem Präfix Parsing (dh. 0x, &HOder #, so haben Sie es abzustreifen , bevor Sie versuchen , den Wert zu analysieren).

Grundsätzlich würden Sie dies tun:

uint color;
var hex = TextBox1.Text;

if (hex.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase) ||
    hex.StartsWith("&H", StringComparison.CurrentCultureIgnoreCase)) 
{
    hex = hex.Substring(2);
}

bool parsedSuccessfully = uint.TryParse(hex, 
        NumberStyles.HexNumber, 
        CultureInfo.CurrentCulture, 
        out color);

In diesem Artikel finden Sie ein Beispiel für die Verwendung der NumberStyles-Aufzählung: http://msdn.microsoft.com/en-us/library/zf50za27.aspx

Jeremy Wiebe
quelle
-1 funktioniert nicht: siehe MSDN-Beispiel, das Sie verknüpfen! "Die versuchte Konvertierung von '0x80C1' ist fehlgeschlagen."
Peenut
3
Sie haben Recht! Um eine Hex-Zahl wie "0x80C1" zu analysieren, müssten Sie den Teil "0x" entfernen. Ich habe mein Codebeispiel entsprechend aktualisiert. Vielen Dank.
Jeremy Wiebe
17
Persönlich würde ich dieses Verhalten einen Fehler nennen. Warum um alles in der Welt würden sie das Flag Allow HexSpecifier nennen, wenn es tatsächlich keinen Hex Specifier zulässt?
Tom Lint
Denken Sie daran, dass es mindestens zwei gängige Hex-Spezifizierer gibt: 0x und & H
Haymo Kutschbach
habe gerade eine andere mögliche Darstellung gefunden: '# 0000103A3C ..'
Haymo Kutschbach
14

Oder wie

string hexNum = "0xFFFF";
string hexNumWithoutPrefix = hexNum.Substring(2);

uint i;
bool success = uint.TryParse(hexNumWithoutPrefix, System.Globalization.NumberStyles.HexNumber, null, out i);
Corey Ross
quelle
5

Hier ist eine Try-Parse-Funktion:

    private static bool TryParseHex(string hex, out UInt32 result)
    {
        result = 0;

        if (hex == null)
        {
            return false;
        }

        try
        {
            result = Convert.ToUInt32(hex, 16);

            return true;
        }
        catch (Exception exception)
        {
            return false;
        }
    }
Curtis Yallop
quelle