存储/检索位的最佳方式 C#

Net*_*hie 1 c# bit-manipulation

我正在修改现有的 C# 解决方案,其中验证数据并存储状态,如下所示:

a) 给定的记录根据某些编号进行验证。条件(比如 5)。失败/通过状态由一个位值表示(0 - 通过;1 - 失败) b) 因此,如果一条记录在所有 5 次验证中均失败,则值将为 11111。这将转换为十进制并存储在数据库中。

再次,该十进制值将转换回二进制(使用按位 & 运算符),用于显示通过/失败的记录。

问题是,C# 中使用 long 数据类型来处理小数,而 SQL Server 2008 中使用“decimal”数据类型来存储该十进制值。最大。转换为二进制的 long 值最多只能容纳 64 位,因此验证计数当前限制为 64。

我的要求是删除这个限制以允许任何不。的验证。

如何存储大号?位并检索它们?另外,请记住,这是一个现有的 (.NET 2.0) 解决方案,无法升级/使用任何第 3 方库,并且更改必须最小化

最新更新

是的,从应用程序的角度来看,这个解决方案似乎没问题,即只要我(又名当前的解决方案)仅使用 C# 即可。然而,现有解决方案的设计者通过在 SQL Server DB 中存储转换为十进制的二进制值(11111 表示所有 5 条记录都失败,10111 - 除第 4 条记录之外的所有记录都失败,等等),使事情变得复杂。SP 使用该值得出 no。每次验证失败的记录数。

OPEN sValidateCUR                        
 FETCH NEXT FROM sValidateCUR INTO @ValidationOID,@ValidationBit, @ValidationType            
 WHILE @@FETCH_STATUS = 0                        
 BEGIN                 
 -- Fetch the Error Record Count                
 SET @nBitVal = ABS(RPT.fGetPowerValue(@ValidationBit))  -- Validation bit is no. of a type of validation, say, e.g. 60. So 1st time when loop run, ValidationBit will be 0
select @ErrorRecordCount = COUNT(1) FROM 
 <<Error_Table_Where_Flags_are availble in decimal values>>
          WITH(NOLOCK) WHERE  ExpressionValidationFlags & CAST(CAST(@nBitVal AS VARCHAR(20)) AS Bigint) = CAST(@nBitVal AS VARCHAR(20)) -- For @ValidationBit = 3, @nBitVal = 2^3 = 8
Run Code Online (Sandbox Code Playgroud)

现在,在应用程序中,使用 BitArray,我设法将通过/失败的记录存储在 BitArray 中,将其转换为 byte[] 并作为 VARBINARY(100)... 存储在 SQL Server 中(同一列 ExpressionValidationFlags,之前是 BIGINT,现在是 VARBINARY 并保存字节数组)。然而,为了完成我的更改,我需要修改上面的SP。

再次期待大家的帮助!!

谢谢

Dmi*_*nko 5

为什么不使用专门设计的类BitArray呢?

http://msdn.microsoft.com/query/dev11.query?appId=Dev11IDEF1&l=EN-US&k=k(System.Collections.BitArray);k(TargetFrameworkMoniker-.NETFramework,版本%3Dv4.5);k(DevLang -csharp)&rd=true

例如

  BitArray array = new BitArray(150); // <- up to 150 bits

  ...
  array[140] = true;  // <- set 140th bit 
  array[130] = false; // <- reset 130th bit 
  ...
  if (array[120]) {   // <- if 120th bit is set
    ...
Run Code Online (Sandbox Code Playgroud)