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
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.
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.
[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;
}