0

「111111」という文字列から2進数を生成し、それを10進数に変換してデータベースに保存するという要件があります。この2進数の各桁(つまり1/0)は、アプリケーション内のさまざまなモジュールに対するユーザーのさまざまなアクセス権を示します。モジュールの数が増えると、この2進数の桁数も増えます。2進数が64の長さに達するまでに(つまり、64 x 1s)、次を使用して10進数に変換することができました。

Int64 dec =Convert.ToInt64(binVal,2);

そしてそれはうまくいきました。ただし、長さが65に増加すると、オーバーフロー例外が発生しました。UInt64の値が大きすぎるか小さすぎます。この65の長さの2進数を10進数または他の形式に変換してデータベースに保存できる、考えられる解決策を誰かが提案できますか。

前もって感謝します。

4

2 に答える 2

2

長さ65以上の2進数を10進数に変換するには、次のようなメソッドを作成する必要があります。

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;
}
于 2012-11-21T08:45:23.387 に答える
1

通常の数値型は、SQL Server でも C# でも、64 ビットを超えるデータには適していません。

あなたの他の選択肢は次のとおりです。

  • 最大 128 ビットを提供するuniqueidentifier(GUID) フィールド。
  • binaryまたはフィールド。思いつく限りのvarbinary数のビットに使用できます。
  • 各アクセス権の個別のビット フィールド。SQL Server はそれらを自動的にバイトにパックします。データを永続化するだけでなく、直接クエリを実行する場合、これは有力な候補です。
  • すでに述べたように文字列ですが、これはスペースの無駄遣いになります。
于 2012-11-21T07:20:01.763 に答える