简体   繁体   English

无法将 map c 结构正确转换为 c# 结构

[英]Not able to properly map c struct to c# struct

I'm trying to map a bytearray in c#, which is of 56 bytes and the struct i got for it is like this in C我正在尝试 map 中的字节数组 c#,它有 56 个字节,我得到的结构在 C 中是这样的

struct cequivalentstruct{
    uint32_t Descriptor;

    uint32_t Value;

    uint32_t Minimum;

    uint32_t Maximum;

    uint32_t Default;

    uint16_t Next;

    uint16_t Previous;

    char Units[4];

    uint16_t Multiplier;

    uint16_t Divisor;

    uint16_t Base;

    uint16_t Offset;

    char Link[3];

    char pad;

    char Name[16];
}

and i have coverted that to我已经把它改成

         [StructLayout(LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Ansi)]
        public struct ParameterResponse
        {
            [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
            public uint Descriptor;
            [MarshalAs(UnmanagedType.I4, SizeConst = 4)]
            public uint Value;
            [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
            public uint Minimum;
            [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
            public uint Maximum;
            [MarshalAs(UnmanagedType.U4, SizeConst = 4)]
            public uint Default;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Next;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Previous;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
            public char[] Units;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Multiplier;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Divisor;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Base;
            [MarshalAs(UnmanagedType.U4, SizeConst = 2)]
            public uint Offset;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
            public char[] Link;
            [MarshalAs(UnmanagedType.U1, SizeConst = 1)]
            public char pad;
            [MarshalAs(UnmanagedType.ByValArray)]
            public byte[] Name;
    
            public ParameterResponse(uint descriptior, uint value, uint maximum, uint minimum, uint defaultvalue, uint next, uint previous,
                char[] units, uint multiplier, uint divisor, uint baseValue, uint offset, char[] link, char padValue, byte[] name)
            {
                Descriptor = descriptior;
                Value = value;
                Maximum= maximum;
                Minimum= minimum;
                Default = defaultvalue;
                Next= next; Previous= previous;
                Units = units;
                Multiplier = multiplier;
                Divisor = divisor;
                Base = baseValue; Offset = offset;
                Link = link;
                pad = padValue;
                Name = name;
    }
    }

}

I'm not sure if I'm missing something in this, because when I try to convert my byteArray to this struct, but the struct is not exactly taking the appropriate sizeconst defined, any inputs would be helpful.我不确定我是否遗漏了一些东西,因为当我尝试将我的 byteArray 转换为这个结构时,但该结构没有完全采用适当的 sizeconst 定义,任何输入都会有所帮助。

Try this.尝试这个。

uint16_t should map to ushort , char should map to byte or sbyte , The Name field need a SizeConst attribute, Using the default pack size. uint16_t应该是 map 到ushortchar应该是 map 到bytesbyteName字段需要一个SizeConst属性,使用默认包大小。

[StructLayout(LayoutKind.Sequential)]
public struct ParameterResponse
{
    public uint Descriptor;
    public uint Value;
    public uint Minimum;
    public uint Maximum;
    public uint Default;
    public ushort Next;
    public ushort Previous;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] Units;
    public ushort Multiplier;
    public ushort Divisor;
    public ushort Base;
    public ushort Offset;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] Link;
    public byte pad;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public byte[] Name;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM