陈曦之光 2021-08-06 01:10 采纳率: 0%
浏览 70
已结题

在C#中使用带引用(也是联合体)的联合体,在字节流转换成结构体的最后一步出错了

最近在用xamarin开发一个socket通信程序

先看代码

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct NETCMD  //指令包
        {
            [FieldOffset(0)] public uint16_t Frame;         
            [FieldOffset(2)] public uint16_t CmdType;      
            [FieldOffset(4)] public uint32_t DevID;
            [FieldOffset(8)] public CmdData CmdData;  
        };

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct CmdData       //命令数据
        {
            [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)] public uint8_t[] Batydata;
            [FieldOffset(0)] public DevInfo DevInfo;
            [FieldOffset(0)] public RcvJPGInfo jpgInfo;
        };

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct DevInfo    //设备信息
        {

            [FieldOffset(0)] public uint32_t ManCode;     
            [FieldOffset(4)] public uint32_t ProID;      
            [FieldOffset(8), MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)] public uint8_t[] MACadd;     
            [FieldOffset(14)] public uint32_t Edition_num;     
            [FieldOffset(18)] public uint16_t Crc;  
            [FieldOffset(20)] public uint16_t Vid;   
            [FieldOffset(22)] public uint16_t Pid;   
            [FieldOffset(24)] public uint16_t Name;   
            [FieldOffset(26), MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)] public uint16_t[] CheckDot; 
            [FieldOffset(42)] public uint16_t KeyInfo;    
        }

[StructLayout(LayoutKind.Explicit,Pack =1)]
        public struct RcvJPGInfo           //JPG信息
        {
            [FieldOffset(0), MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)] public uint8_t[] jpg_name;
            [FieldOffset(16)] public uint16_t jpg_filesize;
            [FieldOffset(18)] public uint16_t jpg_width;
            [FieldOffset(20)] public uint16_t jpg_height;
        };

//然后时结构转换

public static Object BytesToStruct(Byte[] bytes, Type strcutType)
        {
            int size = Marshal.SizeOf(strcutType);
            IntPtr buffer = Marshal.AllocHGlobal(size);

            try
            {
                Marshal.Copy(bytes, 0, buffer, size);
                return Marshal.PtrToStructure(buffer, strcutType);
            }
            catch(Exception e)
            {
                return e;
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

编译没出错
但当收到客户端消息的时候,在把流转换成结构体的时候
在 Marshal.PtrToStructure(buffer, strcutType); 这一步直接闪退

这是输出的错误信息:
[] Type CmdData which has an [ExplicitLayout] attribute cannot have a reference field at the same offset as another field.
[libc] Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 4327 (Thread-15), pid 4181

大概意思就是引用字段的偏移量不能和另一个字段的偏移量相同

虽然大概知道是什么问题
但找了很多资料,也不知道怎么解决
希望有人能指导一下

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-08-09 16:56
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。

    ​​​​因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 8月14日
  • 创建了问题 8月6日

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题