识别 BitValue 列中的值

Identify values in BitValue column

注意:我不确定如何最好地为这个问题加上标题和标签,欢迎进行有用的修改!

我正在将一个 ASP.NET Webforms 网站(我没有正确版本的源代码)逆向工程到 ASP.NET MVC 首先使用数据库 entity framework,并且我很难理解特定 view/set 数据的工作原理。

一条记录有一个 "Options" 字段,其中包含一系列数字,当读取这些数字时,可以识别 48 个选项中的哪个选项是正确的。我正在想办法 read/write 这个结果。

因此,选项 table 的结构如下: 如您所见,有一个 BitValue 列(持续到 281474976710656);我相信这是我需要用来识别带有这样一个数字的选项的东西:5120 或 17592186044480 如果该数字仅标识一个选项,我可能能够更容易地解决这个问题,但不幸的是,可以标识多个选项。

例如,一条记录的选项字段中包含:17592186044480 这标识的选项(当我指的是现有网站时)是: 程序(比特值:64) 岸上船员错误(BitValue:17592186044416)

但我终究无法弄清楚这两个数字如何转换为选项字段中的数字!

有什么提示吗?

好的,所以 64 + 17592186044416 = 17592186044480 这有助于理解数字是如何生成的,但是我如何反转它来识别组成数字的选项?

结论 我接受了一个答案,结合一些评论,它帮助我找到了解决方案。

最后,我把 "options" 作为一个枚举写出来了...

[Flags] public enum options : long
{
    Master_Pilot_Exchange = 2,
    Bridge_Team_Issues = 4,
    Language_Difficulty = 8,
    Briefing = 16,
    Crew_Competency = 32,
    Procedure = 64,
    Personal_Performance = 128,
    Fatigue = 256,
    ....
}

并创建了一个函数来检查每个选项以查看它是否包含在 bitValue 中:

private bool checkBits(long maskIn, int optionId)
    {
        options mask = (options)maskIn;
        var toCheck = db.InitialReportOptions.Single(i => i.InitialReportOptionID == optionId);
        options chk = (options)toCheck.BitValue;
        bool test = false;
        if ((mask & chk) == chk)
        {
            test = true;
        }
        //
        return test;
    }

当我需要向记录添加新的位值时,我使用以下命令:

options newMask = (options)0;
            long bitResult = 0;
            foreach(var option in model.ReportOptions)
            {
                if (option.IsTrue)
                {
                    var bitv = (options)option.BitValue;
                    bitResult = bitResult | ( (long)newMask | (long)bitv);
                }
            }
            model.InitialReportRecord.Options = bitResult;

我敢说它可能会更有效率,但它确实有效,所以我很高兴!

首先,您需要知道 48 个标志中每个标志的位值....然后在 C# 中...

const int Procedure = 64

if ((myData.InitialReportOption & Procedure) == Procedure)
   // Then Procedure flag is active
else  // (myData.InitialReportOption & Procedure) == 0
   // Procedure is not active

同样,为了使您能够做...

myData.InitialReportOption |= Procedure;

并禁用

myData.InitialReportOption &= ~Procedure;

有关更多信息,请尝试此博客...

http://blog.typps.com/2007/10/bitwise-operators-in-c-or-xor-and-not.html