【发布时间】:2021-03-03 08:28:54
【问题描述】:
将结构从 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 e.t.c 值。
编辑(测试程序):
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,
}
【问题讨论】:
-
您的要求不是很清楚。你想提高可读性吗?表现?你使用这个的上下文是什么?
-
@JonasH 我希望代码更干净。现在要获得 4 位的值,我必须创建数组并使用 GetValueFromFlags () 方法,这似乎不可读。我的程序中有很多结构,现在我必须为每个值都这样做。此外,如果我想在其他地方获得这个值,我必须再做一次。