C# C中从十六进制到int的转换不正确#
问题的原因是什么?我的方法返回不正确的int值。当我给它十六进制值AB或DC或类似的值时,它返回int=0,但当我给它十六进制值22时,它返回int=22。(尽管在这种情况下int应该是34) 我尝试使用Number=Convert.ToInt32(GetX(Xx,Rr));但它给出了相同的结果,但对于包含字母的任何内容,都是null而不是0。使用C# C中从十六进制到int的转换不正确#,c#,int,hex,C#,Int,Hex,问题的原因是什么?我的方法返回不正确的int值。当我给它十六进制值AB或DC或类似的值时,它返回int=0,但当我给它十六进制值22时,它返回int=22。(尽管在这种情况下int应该是34) 我尝试使用Number=Convert.ToInt32(GetX(Xx,Rr));但它给出了相同的结果,但对于包含字母的任何内容,都是null而不是0。使用Convert.ToInt32(string,int)。这样你就可以给一个基数,这个数字应该用它来解释。例如 return Convert.ToInt
Convert.ToInt32(string,int)
。这样你就可以给一个基数,这个数字应该用它来解释。例如
return Convert.ToInt32(GetX(Xx, Rr), 16);
(您也不会检查TryParse
的返回值,这将提示解析失败。)
如果需要十进制和十六进制数字,则需要根据数字的外观进行分支,并使用以10为基数或以16为基数。例如,如果您的十六进制数字总是以0x
开头,您可以使用以下内容:
string temp = GetX(Xx, Rr);
return Convert.ToInt32(temp, temp.StartsWith("0x") ? 16 : 10);
但这将取决于你如何(如果有的话)区分这两者。当然,如果一切都是十六进制,那么就没有这种必要。
int.TryParse
解析以10为基数的整数
使用
Convert.ToUInt32(十六进制,16)
代替使用numberstyle.HexNumber
:
using System;
using System.Globalization;
class Test
{
static void Main()
{
string text = "22";
int value;
int.TryParse(text, NumberStyles.HexNumber,
CultureInfo.InvariantCulture, out value);
Console.WriteLine(value); // Prints 34
}
}
顺便问一下,如果无法解析该值,是否确实要以静默方式返回0?如果没有,请使用返回值int.TryParse
确定解析是否成功。(这就是它在原始代码中为“AB”返回0的原因。)这是我的解决方案
kTemp = int.Parse(xcc, System.Globalization.NumberStyles.HexNumber);
上面的kTemp是一个整数,xcc是一个字符串。
xcc可以是任何类似的东西;FE,10BA,FE0912。。。就是说,;xcc是任意长度的十六进制字符字符串。
当心;我的十六进制字符串没有得到0x前缀。什么是
GetX
?int.Parse/int.TryParse只理解base10,而不理解base16。罗兰:我猜它会返回一个字符串。但我想说这在这里也不太重要。可爱,我不知道那件事。这里是否有一种方法优于另一种方法(除了关于不可解析输入的语义,这显然取决于需要什么)?@Joey:我个人更喜欢使用TryParse
,因为它提供了更多的控制。if(!int.TryParse(“22”,NumberStyles.HexNumber,CultureInfo.InvariantCulture,out int HexNumber))返回0代码>名为hexNumber的int现在可以使用了,当使用out int而不是out时,它很小而且很致命。out int创建变量并输出到它,而out引用一个int并输出到它。@MaDude:是的,我非常了解C#7中的out
参数支持,但我不会把我所有5年以上的帖子都翻一遍来编辑它们…@JonSkeet向其他来到这里的用户指出,m8,使用Convert.ToInt32冷静下来,你不能处理失败(只是作为不干净的例外)。这就是为什么特里帕斯更好。
kTemp = int.Parse(xcc, System.Globalization.NumberStyles.HexNumber);