【问题标题】:Binary String to Integer二进制字符串到整数
【发布时间】:2009-08-13 12:05:27
【问题描述】:

我有一个用户输入的二进制字符串,我需要将其转换为整数。

一开始,我天真地用了这么简单的一行:

Convert.ToInt32("11011",2);

不幸的是,如果用户直接输入整数,这会引发异常。

Convert.ToInt32("123",2); // throws Exception

如何确定用户输入的字符串确实是二进制字符串?

  • try..catch
  • Int32.TryParse

谢谢

【问题讨论】:

  • 用户如何输入字符串?如果它是一个表格,你不能限制它只接受'0'和'1'吗?
  • 为什么try - catch“丑”?
  • 你可能是对的,它并没有那么难看。实际上我现在就选择了它,因为十六进制值也突然成为可能。因此,一些简单的 try-catch 只是最简单和最简单的解决方案。谢谢大家。

标签: c# string binary integer


【解决方案1】:

您可以使用Regex 来检查它是“^[01]+$”(或者更好的是“^[01]{1,32}$”),然后使用Convert?

当然,无论如何,例外不太可能成为一个大问题!不优雅?也许。但它们有效。

示例(针对垂直空间格式化):

static readonly Regex binary = new Regex("^[01]{1,32}$", RegexOptions.Compiled);
static void Main() {
    Test("");
    Test("01101");
    Test("123");
    Test("0110101101010110101010101010001010100011010100101010");
}
static void Test(string s) {
    if (binary.IsMatch(s)) {
        Console.WriteLine(Convert.ToInt32(s, 2));
    } else {
        Console.WriteLine("invalid: " + s);
    }
}

【讨论】:

  • 这不能正确处理 Convert.ToString((long)Int32.MaxValue + 1, 2) 的转换。这应该被拒绝,但被错误地转换为 Int32.MinValue。
  • 为什么要拒​​绝?它是一个有效的 32 位二进制值。如果您选择将其解释为 int32,那么可以确定:任何带有 msb 集的东西都将是负数......并且?
  • 感谢伟大的解决方案。我真的同意了。但是需求发生了一些变化,所以我决定尝试 - catch 是最简单和最干净的解决方案
  • 我没有太多的正则表达式经验,这是否检查有 1-32 个字符并且这些字符必须是 0 或 1?对有效八进制字符串进行类似检查的最佳方法是什么?我希望 .NET 有一个 int.TryParse,您可以在其中检查二进制和八进制,而不仅仅是十进制和十六进制
  • @R1PFake 是的,^...$ 测试字符串的开始/结束(所以:没有别的); [01] 表示“0 或 1”,{1,32} 表示“介于 1 到 32 次之间,包括”
【解决方案2】:

感谢您提供出色且令人难以置信的快速答案!

很遗憾,我的要求发生了变化。现在用户几乎可以输入任何格式。二进制、十进制、十六进制。所以我决定 try-catch 只是提供最简单和最干净的解决方案。

因此,为了更好地衡量,我发布了我现在使用的代码。我认为它很清楚,甚至有点优雅,或者我认为^^。

switch (format)
{
    case VariableFormat.Binary:
        try
        {
            result = Convert.ToInt64(value, 2)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Decimal:
        try
        {
            result = Convert.ToInt64(value, 10)
        }
        catch
        {
            // error handling
        }
        break;
    case VariableFormat.Hexadecimal:
        try
        {
            result = Convert.ToInt64(value, 16)
        }
        catch
        {
            // error handling
        }
        break;
}

感谢您鼓励我使用 try-catch,我认为它确实提高了我的代码的可读性。

谢谢

【讨论】:

  • 什么,你不喜欢八进制?说真的,如果有人输入“11”并表示以 10 为基数怎么办?标准解决方案是使用前缀('0b'、''、'0x'),但这可能不符合您的要求。
  • 是的,没有八进制^^。用户实际上必须在组合框中选择她想要使用的格式。我也考虑过您的解决方案,但使用组合框似乎更容易。非常感谢您的意见。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多