【问题标题】:Converting binary to decimal二进制转十进制
【发布时间】:2012-11-09 09:05:58
【问题描述】:

我有一个要求,我从字符串“111111”生成二进制数并将其转换为十进制数以存储在数据库中。这个二进制数的每个数字(即 1/0)表示用户对应用程序中不同模块的不同访问权限。随着模块数量的增加,这个二进制数的位数也会增加。当二进制数达到 64 的长度(即 64 乘以 1s)时,我能够使用

将其转换为十进制数
Int64 dec =Convert.ToInt64(binVal,2);

而且效果很好。但是当长度增加到 65 时,它给出了溢出异常:对于 UInt64,值要么太大要么太小。任何人都可以提出任何可能的解决方案,我可以将这个长度为 65 的二进制数转换为十进制数或任何其他形式以将其保存在数据库中。

提前致谢。

【问题讨论】:

  • 您可以将其作为字符串存储在数据库中,然后在从数据库中提取值后执行您的逻辑。
  • 感谢您的回复,但我无法将其直接存储在数据库中。有一些进一步的处理,我需要将其转换为十进制。

标签: c# asp.net binary decimal


【解决方案1】:

要将长度为 65 或更长的二进制数转换为十进制/无论您必须编写这样的方法:

public BigInteger FromBinaryString(string binary)
{
    if (binary == null)
        throw new ArgumentNullException();
    if (!binary.All(c => c == '0' || c == '1'))
        throw new InvalidOperationException();

    BigInteger result = 0;
    foreach (var c in binary)
    {
        result <<= 1;
        result += (c - '0');
    }
    return result;
}

它使用System.Numerics.BigInteger 结构来保存大数字。然后您可以将其显式转换为decimal(或字节数组)并将其存储在您的数据库中:

var bigInteger = FromBinaryString("100000000000000000000000000000000000000000000000000000000000000000");
// to decimal
var dec = (decimal)bigInteger;
// to byte array
var data = bigInteger.ToByteArray();

编辑:如果您在 NET 3.5 下,只需使用 decimal 而不是 BigInteger(也将左移运算符 &lt;&lt; 替换为乘法运算符 * 用于小数) :

public decimal FromBinaryString(string binary)
{
    if (binary == null)
        throw new ArgumentNullException();
    if (!binary.All(c => c == '0' || c == '1'))
        throw new InvalidOperationException();

    decimal result = 0;
    foreach (var c in binary)
    {
        result *= 2;
        result += (c - '0');
    }
    return result;
}

【讨论】:

  • @ABC:如果存在相关限制(例如仅限于特定框架版本),则该信息应该在您的帖子中,而不是隐藏在对答案的评论中。
【解决方案2】:

普通的数字类型不适用于超过 64 位的数据,无论是在 SQL Server 还是在 C# 中。

您的其他选择包括:

  • uniqueidentifier (GUID) 字段,最多可提供 128 位。
  • binary 或 varbinary 字段,可用于尽可能多的位。
  • 每个访问权限的单独位字段。 SQL Server 会自动将它们打包成字节。如果您要直接查询数据而不仅仅是持久化数据,这将是一个很好的选择。
  • 一个字符串,如前所述,但这会严重浪费空间。

【讨论】:

  • 是否可以将其转换为十六进制而不是保存完整的 65 位二进制数?
  • 十六进制是一种显示数字而不是存储数字的方法。 15 == F == 17 == 1111(十进制、十六进制、八进制、二进制)。仍然要存储 NUMBER 15,您需要 4 个“位”。
猜你喜欢
  • 2014-10-30
  • 2014-01-07
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-26
  • 2018-03-11
  • 2022-01-26
相关资源
最近更新 更多