识别 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
注意:我不确定如何最好地为这个问题加上标题和标签,欢迎进行有用的修改!
我正在将一个 ASP.NET Webforms 网站(我没有正确版本的源代码)逆向工程到 ASP.NET MVC 首先使用数据库 entity framework,并且我很难理解特定 view/set 数据的工作原理。
一条记录有一个 "Options" 字段,其中包含一系列数字,当读取这些数字时,可以识别 48 个选项中的哪个选项是正确的。我正在想办法 read/write 这个结果。
因此,选项 table 的结构如下:
例如,一条记录的选项字段中包含: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