2012-11-21 198 views
0

我有一個要求,我從一個字符串生成一個二進制數說「111111」,並將其轉換爲十進制數存儲在數據庫中。來自此二進制數字的每個數字(即1/0)表示用戶對應用程序中不同模塊的不同訪問權限。當模塊數量增加時,此二進制數字的位數也會增加。通過在二進制數達到64個,(即64分1秒)長的時間,我可以用轉換二進制到十進制

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

將其轉換爲十進制數,它工作得很好。但是,當長度增加到65時,它給出了一個溢出異常:對於UInt64,值對於太大或太小都是如此。任何人都可以提出任何可能的解決方案,我可以將此長度爲65的二進制數轉換爲十進制或其他任何形式以將其保存在數據庫中。

在此先感謝。

+0

你可以將其存儲在數據庫中的字符串,然後你拉從數據庫中的值後執行您的邏輯。 –

+0

感謝您的回覆,但我無法直接將其存儲在數據庫中。有一些進一步的處理,我需要將其轉換爲十進制。 – ABC

回答

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

BigInteger在框架4中可用,我使用的是3.5。 – ABC

+0

@ABC:更新了我的回答 – Alex

+1

@ABC:如果存在相關限制(例如被限制在特定的框架版本中),那麼這些信息應該在您的文章中,而不是埋在評論中。 –

1

正常的數字類型不適用於超過64位的數據,無論是在SQL Server還是在C#中。

你的其它替代方案包括:

  • uniqueidentifier(GUID)字段,這將提供高達128個比特。
  • A binaryvarbinary字段,該字段可用於您可以設想的儘可能多的位。
  • 每個訪問權限的單獨位域。 SQL Server會自動將它們打包成字節。如果您直接查詢數據,而不僅僅是堅持數據,這將是一個強有力的候選人。
  • 一個字符串,如前所述,但這將是一個可怕的空間浪費。
+0

是否可以將其轉換爲十六進制而不是保存完整的65位二進制數? – ABC

+2

十六進制是一種顯示數字並不存儲它的方法。 15 == F == 17 == 1111(十進制,十六進制,十進制,二進制)。仍然用於存儲NUMBER 15,您需要4個「位」。 – igrimpe