如何将十六进制值解析为一个uint?


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

不起作用。我究竟做错了什么?

Answers:


119

尝试

Convert.ToUInt32(hex, 16)  //Using ToUInt32 not ToUInt64, as per OP comment

5
需要记住的一点(尽管可能不适用于此特定的整数转换)...如果输入错误,那么Convert.ToUInt32可能比UInt32.TryParse慢几个数量级,例如Convert.ToDouble与Double.TryParse:stackoverflow .COM /问题/ 586436 / ... 此外,它并不总是很清楚什么它转换:stackoverflow.com/questions/586436/...
Triynko

1
正如@Triynko所说,这是一个错误的过程,因为它很容易引发异常。uint.TryParse是可取的,因为它返回一个指示成功或失败的布尔值,而不是抛出异常。
Zenexer 2012年

1
这种方法Convert.ToUInt32将把“ 0x”前缀作为输入的一部分来处理。
Derek W

48

您可以使用重载TryParse(),该重载将NumberStyle参数添加到TryParse提供解析十六进制值的调用中。使用NumberStyles.HexNumber此功能,您可以将字符串作为十六进制数字传递。

:这个问题NumberStyles.HexNumber是,它支持带有前缀解析值(即0x&H或者#,所以你必须试图解析值之前剥离其关闭)。

基本上,您可以这样做:

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);

有关如何使用NumberStyles枚举的示例,请参阅本文:http : //msdn.microsoft.com/zh-cn/library/zf50za27.aspx


-1不起作用:请参见您链接的MSDN示例哟!“尝试转换'0x80C1'失败。”
peenut

3
你是对的!要解析“ 0x80C1”之类的十六进制数字,您必须去除“ 0x”部分。我已经适当地更新了代码示例。谢谢。
杰里米·韦伯

17
就个人而言,我将此行为称为错误。如果实际上它实际上不允许任何十六进制说明符,为什么他们在地球上将其标记为“允许HexSpecifier”?
汤姆·林特

请记住,至少有两个常见的十六进制说明符:0x和&H
Haymo Kutschbach 2016年

刚刚发现了另一个可能的表示形式:“#0000103A3C ..”
Haymo Kutschbach 2016年

14

或喜欢

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

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

5

这是一个try-parse样式函数:

    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;
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.