我正在用C# + WPF开发一个程序来分析一个嵌入式系统的固件。这个固件是用C写的,包括许多结构。在新的固件版本之后,这些结构之一已经被更改。我的软件必须支持所有固件版本。
固件ver.1
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MainStruct
{
public byte Member1;
public byte Member2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public UInt16[] Member3;
}
固件Ver.2
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MainStruct
{
public byte Member1;
public Uint Member2;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public UInt16[] Member3;
}
逻辑
public void ShowStruct(MainStruct MyStruct)
{
ShowData(MyStruct.Member3);
}
软件执行的步骤概要:
如何确保兼容性?
发布于 2015-06-02 04:00:42
使结构的两个版本都实现一个接口。使您的接口具有每个对象的getter和setter。确保您正确处理铸造。
interface MainStructInterface()
{
void setMember1(byte b);
byte getMember1();
void setMember2(Uint b); // Cast to byte in the first firmware version struct.
Uint getMember2();
// etc
}
此外,请查看此结构布局格式:
[StructLayout(LayoutKind.Explicit, Pack = 1)]
public unsafe struct StructMessage
{
[FieldOffset(0)] public fixed byte data[13]
[FieldOffset(0)] public byte Member1;
[FieldOffset(1)] public Uint Member2;
[FieldOffset(5)] public fixed UInt16 Member3[4];
}
使用这种格式,您可以将所有内容加载到字节数组中,然后非常容易地访问每个成员。
https://stackoverflow.com/questions/30586592
复制相似问题