将包含以“0x”开头的十六进制值的字符串转换为整数或长整数

Posted

技术标签:

【中文标题】将包含以“0x”开头的十六进制值的字符串转换为整数或长整数【英文标题】:Convert a string containing a hexadecimal value starting with "0x" to an integer or long 【发布时间】:2011-05-15 20:37:37 【问题描述】:

如何在 C# 中将“0x310530”之类的字符串值转换为整数值?

我已经尝试过 int.TryParse(甚至 int.TryParseSystem.Globalization.NumberStyles.Any)但它没有工作。

更新: 似乎 Convert.ToInt64 或 Convert.ToInt32 无需删除前导“0x”即可工作:

long hwnd = Convert.ToInt64("0x310530", 16);

Convert.ToInt64 Method (String, Int32) 的文档说:

"如果fromBase为16,则可以在值指定的数字前加前缀 参数为“0x”或“0X”。”

不过,我更喜欢 TryParse 这样不会引发异常的方法。

【问题讨论】:

好问题,但是 -1 - Convert.ToInt32 不起作用... “Laeding”或“prefix”“0x”(不是“trailing”)。 【参考方案1】:
int value = (int)new System.ComponentModel.Int32Converter().ConvertFromString("0x310530");

【讨论】:

这确实有效,谢谢。我仍然更喜欢像 TryParse 这样不会引发异常的方法。 @David:围绕它构建一个包装器,它可以捕获异常并表现得像 TryParse。如果您使用 C# 3.0 或更高版本,您甚至可以尝试一些方法扩展魔法。 更多关于 TypeConverter 的优点direct from SHanselman【参考方案2】:

来自MSDN:

NumberStyles.AllowHexSpecifier

表示数字字符串表示一个十六进制值。有效的十六进制值包括数字 0-9 以及十六进制数字 A-F 和 a-f。使用此样式解析的字符串不能以“0x”或“&h”作为前缀

所以你必须先去掉0x前缀:

string s = "0x310530";
int result;

if (s != null && s.StartsWith("0x") && int.TryParse(s.Substring(2),
                                                    NumberStyles.AllowHexSpecifier,
                                                    null,
                                                    out result))

    // result == 3212592

【讨论】:

看起来像一个可怕的名字,因为“0x”和“&H”是常见的十六进制说明符,但它们不是“允许的”。很奇怪。 可以请我相关的question【参考方案3】:

Direct from SHanselman,正如Cristi Diaconescu 所指出的,但我已经包含了主要源代码:

public static T GetTfromString<T>(string mystring)

   var foo = TypeDescriptor.GetConverter(typeof(T));
   return (T)(foo.ConvertFromInvariantString(mystring));

整篇文章值得仔细看看!

【讨论】:

可以请我相关的question【参考方案4】:

如果你删除前导 0x,你可以使用 int.Parse

int a = int.Parse("1310530", NumberStyles.AllowHexSpecifier);

【讨论】:

是的。否则,它将解析 0,并在 x 处停止。 AllowHexSpecifier 不适用于“0x310530”之类的字符串,据记载:“使用此样式解析的字符串不允许以“0x”为前缀。” @Oded:实际上;是的,你知道。 但那是一个完全不同的数字!【参考方案5】:

在 Caverna 的回答的基础上,我添加了一个 tryparse 方法,以便我们可以测试转换是否对某种类型有效。

public static T GetTfromString<T>(string mystring)

    var foo = TypeDescriptor.GetConverter(typeof(T));
    return (T)(foo.ConvertFromInvariantString(mystring));


public static bool TryGetTFromString<T>(string mystring, out T value)

    try
    
        value = GetTfromString<T>(mystring);
        return true;
    
    catch (FormatException)
    
        value = default(T);
        return false;
    

【讨论】:

以上是关于将包含以“0x”开头的十六进制值的字符串转换为整数或长整数的主要内容,如果未能解决你的问题,请参考以下文章

Swift将十六进制字符串或字符转换为整数

将包含十六进制值的字节数组转换为十进制值

js字符串转换为数字 总结

parseInt

数据类型

js 转换成整形