编组复杂的结构,以C# [英] Marshalling complex struct to c#

查看:106
本文介绍了编组复杂的结构,以C#的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我仍然struggeling元帅从C ++到C#中的相当复杂的结构。

i'm still struggeling to marshal a quite complex struct from c++ to c#.

在C ++中结构如下:

The struct in c++ is the following:

typedef struct {
    DWORD Flags;                    
    DWORD TimeCode;                 
    DWORD NodeMoving;   
    Matrix NodeRots[NUM_GYROS];
    Vector Position;                
    DWORD ContactPoints;            
    float channel[NUM_CHANNELS];
} Frame;



矢量:

Vector:

typedef struct {
    union {
        struct {
            float x, y, z;
        };
        float Array[3];
    };
} Vector;



矩阵:

Matrix:

typedef struct {
    union {
        struct {
            float xx, xy, xz;       //This row is the right vector
            float yx, yy, yz;       //This row is the up vector
            float zx, zy, zz;       //This row is the forward vector
        };
        float Array[3][3];          //[row][col]
    };
} Matrix;

这是我在C#中:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public unsafe struct Matrix
    {
        public float xx;
        public float xy;
        public float xz;
        public float yx;
        public float yy;
        public float yz;
        public float zx;
        public float zy;
        public float zz;    
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public unsafe struct Vector{
        public float x;
        public float y;
        public float z; 
    }


    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public unsafe struct Frame{
        public uint Flags;                  
        public uint TimeCode;                   
        public uint NodeMoving;             
        public fixed byte NodeRots[NUM_GYROS];
        public Vector Position;             
        public uint ContactPoints;          
        public fixed float channel[CHANNEL_ARRAY_SIZE];


        public unsafe float[] Channel
        {
            get
            {
                fixed (float* ptr = channel)
                {
                    float[] array = new float[CHANNEL_ARRAY_SIZE];

                    Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE);
                    return array;
                }
            }
        }

        public unsafe Matrix[] nodeRots{
            get{
                fixed (byte* ptr = NodeRots){
                    IntPtr ptr2 = (IntPtr)ptr;
                    Matrix[] array = new Matrix[NUM_GYROS];
                    for (int i = 0; i < array.Length; i++)
                    {
                        array[i] = (Matrix)Marshal.PtrToStructure(ptr2, typeof(Matrix));
                        IntPtr oldptr = ptr2;
                        ptr2 = new IntPtr(oldptr.ToInt32() + Marshal.SizeOf(typeof(Matrix)));
                    }
                    return array;
                }
            }
        }



值标志,时间码, NodeMoving,帧结构的NodeRots已经正确地传递。成员位置,ContactPoints和渠道不正确整理。我认为我必须做的定位构件的东西,但我真的不知道什么是错误完全一样。

the values Flags, TimeCode, NodeMoving, and NodeRots of the Frame struct are already passed correctly. The Members Position, ContactPoints and channel aren't marshalled correctly. I assume I have to do something with the Position Member, but I don't really know whats the mistake exactly.

推荐答案

我已经告诉过你。你不能不在字节固定随机

I have already told you. You can't but a fixed byte randomly.

public fixed byte NodeRots[NUM_GYROS];



必须

must be

public fixed Matrix NodeRots[NUM_GYROS];



那么这样的:

Then this:

Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE)

必须

Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE * sizeof(float));



那么对于 nodeRots 的getter你不吨真的需要 Marshal.PtrToStructure ,因为你的结构,可直接封。

Then for the nodeRots getter you don't really need the Marshal.PtrToStructure, because your struct can be marshaled directly.

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
public unsafe struct Frame
{
    public uint Flags;
    public uint TimeCode;
    public uint NodeMoving;
    public fixed float nodeRots[NUM_GYROS * 9];
    public Vector Position;
    public uint ContactPoints;
    public fixed float channel[CHANNEL_ARRAY_SIZE];

    public unsafe float[] Channel
    {
        get
        {
            fixed (float* ptr = channel)
            {
                float[] array = new float[CHANNEL_ARRAY_SIZE];

                Marshal.Copy((IntPtr)ptr, array, 0, CHANNEL_ARRAY_SIZE * sizeof(float));
                return array;
            }
        }
    }

    public unsafe Matrix[] NodeRots
    {
        get
        {
            fixed (float* ptr = nodeRots)
            {
                Matrix[] array = new Matrix[NUM_GYROS];

                for (int i = 0, y = 0; i < array.Length; i++, y += 9)
                {
                    array[i].xx = ptr[y + 0];
                    array[i].xy = ptr[y + 1];
                    array[i].xz = ptr[y + 2];

                    array[i].yx = ptr[y + 3];
                    array[i].yy = ptr[y + 4];
                    array[i].yz = ptr[y + 5];

                    array[i].zx = ptr[y + 6];
                    array[i].zy = ptr[y + 7];
                    array[i].zz = ptr[y + 8];
                }

                return array;
            }
        }
    }
}

这篇关于编组复杂的结构,以C#的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆