【问题标题】:Incorrect conversion from hex to int in C#在 C# 中从十六进制到整数的错误转换
【发布时间】:2013-02-19 22:40:11
【问题描述】:

问题的原因可能是什么?我的方法返回不正确的 int 值。当我给它 AB 或 DC 或类似的十六进制值时,它返回 int = 0 但是当我给它一个 hex = 22 时,它返回我 int = 22。(尽管在这种情况下 int 应该是 34)。

public int StatusBit(int Xx, int Rr)  {
        int Number;
        int.TryParse(GetX(Xx,Rr), out Number);
            return Number;
    }

我尝试使用 Number = Convert.ToInt32(GetX(Xx,Rr));但它给出了相同的结果,但对于包含字母的任何内容,它都为 null 而不是 0。

【问题讨论】:

  • 什么是GetX? int.Parse / int.TryParse 只理解base10,不理解base16。
  • Rowland:我猜它返回一个字符串。但我想说这在这里也不是很重要。

标签: c# int hex


【解决方案1】:

请改用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);

但这取决于您如何(如果有的话)区分这两者。如果一切都是十六进制的,那么当然不需要这样。

【讨论】:

  • 使用 Convert.ToInt32 您无法处理故障(仅作为不干净的异常)。这就是 TryParse 更好的原因。
【解决方案2】:

使用NumberStyles.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 的原因。)

【讨论】:

  • 可爱,不知道那个。这里是否有一种方法优于另一种方法的偏好(除了关于不可解析输入的语义,这显然取决于一个人的需求)?
  • @Joey:我个人更喜欢使用TryParse,因为它提供了更多的控制权。
  • if(!int.TryParse("22", NumberStyles.HexNumber, CultureInfo.InvariantCulture, out int hexNumber)) return 0; int named hexNumber 现在可以使用了,当使用 out int 而不仅仅是 out 时,小而致命,out int 创建变量并输出到它,而 out 引用一个 int 和输出到它.
  • @MaDude:是的,我非常了解 C# 7 中的out 参数支持,但我不会回顾所有超过 5 年的帖子来编辑它们。 .
  • @JonSkeet 为其他到达这里的用户指出 m8,冷静
【解决方案3】:

int.TryParse 解析一个以 10 为底的整数。

改用Convert.ToUInt32(hex, 16)

【讨论】:

    【解决方案4】:

    这是我的解决方案;

    kTemp = int.Parse(xcc, System.Globalization.NumberStyles.HexNumber);
    

    kTemp 是整数,xcc 是字符串。 xcc 可以是任何东西; FE、10BA、FE0912……也就是说; xcc 是任意长度的十六进制字符串。 谨防;我的十六进制字符串没有得到 0x 前缀。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2010-10-16
      相关资源
      最近更新 更多