将二进制转换为十进制

时间:2012-11-21 06:43:27

标签: c# asp.net binary decimal

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

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

它工作正常。但是当长度增加到65时,它会产生OverFlow异常:对于UInt64,值太大或太小。任何人都可以建议任何可能的解决方案,我可以将这个65长度的二进制数转换为十进制或任何其他形式将其保存在数据库中。

先谢谢。

2 个答案:

答案 0 :(得分:2)

要将长度为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(也可以使用乘法运算符替换左移运算符<<小数*

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;
}

答案 1 :(得分:1)

正常的数字类型不适合64位以上的数据,无论是在SQL Server中还是在C#中。

您的其他选择包括:

  • 一个uniqueidentifier(GUID)字段,最多可提供128位。
  • 一个binaryvarbinary字段,可用于您梦寐以求的最多位数。
  • 每个访问权限的各个位字段。 SQL Server会自动将它们打包成字节。如果您直接查询数据而不是仅仅持久化数据,这将是一个强有力的候选者。
  • 如前所述,这是一个字符串,但这会浪费太多空间。