gpt4 book ai didi

c# - 将复杂结构编码到 C#

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:17 25 4
gpt4 key购买 nike

我仍在努力将一个非常复杂的结构从 C++ 编码到 C#。

C++ 中的结构如下:

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;

矩阵:

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

Frame 结构体的Flags、TimeCode、NodeMoving 和NodeRots 值已经正确传递。 Members Position、ContactPoints 和 channel 未正确编码。我假设我必须对 Position Member 做些什么,但我真的不知道到底是什么错误。

最佳答案

我已经告诉过你了。您不能将固定字节用作问题的通用解决方案。

这个

public fixed byte NodeRots[NUM_GYROS];

必须是

public fixed Matrix NodeRots[NUM_GYROS];

然后这个:

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

必须是

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

然后对于 nodeRots getter,您实际上并不需要 Marshal.PtrToStructure,因为您的结构可以直接编码。

[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# - 将复杂结构编码到 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com