首页 > 解决方案 > 有没有更好的方法来重写这个结构,我必须从 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,
}

标签: c#c++structure

解决方案


如果您想组合来自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);

推荐阅读