首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更改C#中的结构以匹配新的C定义

更改C#中的结构以匹配新的C定义
EN

Stack Overflow用户
提问于 2015-06-02 02:56:34
回答 1查看 129关注 0票数 1

我正在用C# + WPF开发一个程序来分析一个嵌入式系统的固件。这个固件是用C写的,包括许多结构。在新的固件版本之后,这些结构之一已经被更改。我的软件必须支持所有固件版本。

固件ver.1

代码语言:javascript
运行
复制
[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

代码语言:javascript
运行
复制
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MainStruct
{
    public byte Member1;
    public Uint Member2;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public UInt16[] Member3;
}

逻辑

代码语言:javascript
运行
复制
public void ShowStruct(MainStruct MyStruct)
{
    ShowData(MyStruct.Member3);
}

软件执行的步骤概要:

  1. 存取装置
  2. 获取固件版本
  3. 选择结构

如何确保兼容性?

EN

回答 1

Stack Overflow用户

发布于 2015-06-02 04:00:42

使结构的两个版本都实现一个接口。使您的接口具有每个对象的getter和setter。确保您正确处理铸造。

代码语言:javascript
运行
复制
interface MainStructInterface()
{
    void setMember1(byte b);
    byte getMember1();
    void setMember2(Uint b); // Cast to byte in the first firmware version struct.
    Uint getMember2();
    // etc
}

此外,请查看此结构布局格式:

代码语言:javascript
运行
复制
    [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];
    }

使用这种格式,您可以将所有内容加载到字节数组中,然后非常容易地访问每个成员。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30586592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档