c# - 有没有更好的方法来重写这个结构,我必须从 c++ 到 c# 获取一些位?
问题描述
将结构从 c++ 重写为 c#。我正在寻找使我的代码透明的最佳解决方案。目前,我必须通过 bool 数组来获取例如 4 位的值。
C++代码:
uint16_t afc :4;
uint16_t prp :3;
uint16_t prs :3;
uint16_t q101 :3;
uint16_t ez1 :1;
uint16_t cw :1;
uint16_t wa_kb :1;
我的 C# 代码:
[Flags]
public enum MainScr_Enum : ushort
{
None = 0,
afc_1 = 1 << 0,
afc_2 = 1 << 1,
afc_3 = 1 << 2,
afc_4 = 1 << 3,
prp_1 = 1 << 4,
prp_2 = 1 << 5,
prp_3 = 1 << 6,
prs_1 = 1 << 7,
prs_2 = 1 << 8,
prs_3 = 1 << 9,
q101_1 = 1 << 10,
q101_2 = 1 << 11,
q101_3 = 1 << 12,
ez1 = 1 << 13,
cw = 1 << 14,
wa_kb = 1 << 15,
}
我必须使用这种方法来获得价值:
var val = GetValueFromFlags(new bool[] {MainScr_Enum.HasFlag(MainScr_Enum.afc_1), MainScr_Enum.HasFlag(MainScr_Enum.afc_2), MainScr_Enum.HasFlag(MainScr_Enum.afc_3), MainScr_Enum.HasFlag(MainScr_Enum.afc_4),})
public int GetValueFromFlags(bool[] list)
{
int value = 0;
for (int i = 0; i < list.Length; i++)
{
value += Convert.ToInt32(list[i]) << i;
}
return value;
}
我从不需要单独的 afc_1 等值。
编辑(测试程序):
class Program
{
static void Main(string[] args)
{
Flags flags = new Flags();
var array = new byte[] { 2, 1, 1, 1 };
flags.FromArray(array);
var test = (int)flags.MainScr_Enum;
flags.MainScr_Enum.HasFlag(MainScr_Enum.afc_1);
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class Flags
{
public ushort TickTimer;
public MainScr_Enum MainScr_Enum;
public void FromArray(byte[] val)
{
int size = Marshal.SizeOf(this);
IntPtr ptr = Marshal.AllocHGlobal(size);
Marshal.Copy(val, 0, ptr, size);
Marshal.PtrToStructure(ptr, this);
Marshal.FreeHGlobal(ptr);
}
}
[Flags]
public enum MainScr_Enum : ushort
{
None = 0,
afc_1 = 1 << 0,
afc_2 = 1 << 1,
afc_3 = 1 << 2,
afc_4 = 1 << 3,
prp_1 = 1 << 4,
prp_2 = 1 << 5,
prp_3 = 1 << 6,
prs_1 = 1 << 7,
prs_2 = 1 << 8,
prs_3 = 1 << 9,
q101_1 = 1 << 10,
q101_2 = 1 << 11,
q101_3 = 1 << 12,
ez1 = 1 << 13,
cw = 1 << 14,
wa_kb = 1 << 15,
}
解决方案
如果您想组合来自Flags
枚举的各种值,您可以将这些值组合在一起,如下所示:
var val = MainScr_Enum.afc_1 | MainScr_Enum.afc_2 | MainScr_Enum.afc_3 | MainScr_Enum.afc_4;
不需要单独的数组等等。
在这种情况下val
将是类型MainScr_Enum
。如果你希望它是一个int
你可以投:
int val = (int)(MainScr_Enum.afc_1 | MainScr_Enum.afc_2 | MainScr_Enum.afc_3 | MainScr_Enum.afc_4);
推荐阅读
- java - 是否可以将 jasper 报告与 java 一起使用,使其像浏览器窗口中的弹出窗口一样?
- c++ - 地图模板类
- html - 如何计算Angular 7中的选中复选框?
- python - 将字符串作为函数的参数,然后打印该字符串的每个可能切片。在每个切片之前加上索引号
- python - 在 Pandas 中将一行添加到现有 CSV 文件中会给出 NaN 值
- excel - vba excel以某些标准访问
- python - 我做了一个创建计算器的初学者项目,然后推送到 Github。我在哪里可以找到我的代码?
- javascript - 如何使用jquery删除父div中具有相同类的重复元素
- reactjs - 如何在屏幕菜单中初始化路由名称以创建TabBottomNavigator
- python - 在 bash 中生成多个 python 脚本