将包含以“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.TryParse 与 System.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”开头的十六进制值的字符串转换为整数或长整数的主要内容,如果未能解决你的问题,请参考以下文章