我有一个要求,我从字符串生成一个二进制数字说“111111”并将其转换为十进制数以存储在数据库中。来自该二进制数的每个数字(即1/0)表示用户对应用程序中的不同模块的不同访问权限。当模块数量增加时,该二进制数字中的位数也将增加。当二进制数达到64的长度(即64次1s)时,我能够使用
将其转换为十进制数。Int64 dec =Convert.ToInt64(binVal,2);
它工作正常。但是当长度增加到65时,它会产生OverFlow异常:对于UInt64,值太大或太小。任何人都可以建议任何可能的解决方案,我可以将这个65长度的二进制数转换为十进制或任何其他形式将其保存在数据库中。
先谢谢。
答案 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位。binary
或varbinary
字段,可用于您梦寐以求的最多位数。