将复杂结构编组到 C#

2023-12-05

我仍在努力将一个相当复杂的结构从 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;

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

Frame 结构体的 Flags、TimeCode、NodeMoving 和 NodeRots 值已正确传递。成员位置、联系点和渠道未正确编组。我想我必须对职位成员做点什么,但我真的不知道到底错在哪里。


我已经告诉过你了。你不能使用fixed byte作为问题的通用解决方案。

This

public fixed byte NodeRots[NUM_GYROS];

must be

public fixed Matrix NodeRots[NUM_GYROS];

然后这个:

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

must be

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

那么对于nodeRotsgetter 你并不真正需要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;
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将复杂结构编组到 C# 的相关文章

  • IIS应用程序池回收+quartz调度

    我正在 IIS 7 5 上运行一个 Web 应用程序 它需要偶尔回收 否则内存使用情况会失控 这是我正在研究的问题 当它回收时 它实际上不会运行 直到另一个请求到来 而quartz不会运行 有没有办法让IIS在回收应用程序池后立即自动启动1
  • 添加 Nullable int 时保持 null?

    我想添加可为空的int 并保留null当所有值都是null 我想要这个结果 1 2 3 1 null 1 null null null O null 0 问题是 如果我将一个值与 null 相加 结果为 null int i1 1 int
  • json.net自定义jobject反序列化

    我正在尝试使用 JsonConvert DeserializeObject string 将字符串反序列化为可与动态一起使用的 jobject 来动态访问 json 文档 但是我想避免知道文档的大小写 以便我可以输入 dynamic doc
  • 将 new 与 decltype 一起使用

    T t T is an implementation detail t new T want to avoid naming T to allow for flexibility t new decltype t error cannot
  • linq 中使用字符串数组 c# 的 'orderby'

    假设我有一个这样的方法定义 public CustomerOrderData GetCustomerOrderData string CustomerIDs var query from a in db Customer join b in
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 增强精神、递归和堆栈溢出

    为什么下面的代码在运行时崩溃 它会给出堆栈溢出错误 include
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐

  • 二进制流“0”不包含有效的 BinaryHeader。随机发生

    我正在开发处理 firebird 数据库请求的 c windows 服务 当我尝试在客户端应用程序上反序列化对象时 我的问题随机发生 有时在 5 分钟后 有时在仅 4 次数据库调用后 它只发生在特定位置 停止在 54 字节数组中的第 18
  • 如何在 GitHub 中使用 Squash 和 Merge?

    在 GitHub 上合并 Pull Requests PR 时 有一种选择 挤压和合并 这样做的目的是什么以及它会做什么 来自 Github 的这篇博文可能会有所帮助 The basic idea is that all the commi
  • iOS系统下如何获取objective-c中的所有进程信息?

    在 Mac OS 下 我可以使用 GetCurrentProcess 和 GetNextProcessInfo 来获取进程信息 但是当我在iOS系统下使用该功能时 出现链接错误 例如 架构 i386 的未定义符号 GetCurrentPro
  • 在 WP7 中更改焦点文本框背景/前景

    每当文本框获得焦点时 文本的边框和前景都会根据当前主题进行更改 主题灯 gt 边框 黑色 文字 白色 背景 透明 主题深色 gt 边框 白色 文本 白色 背景 白色 我希望文本框始终具有边框 白色 文本 白色 背景 透明 当文本框未获得焦点
  • 从 JDBC ResultSet 中读取日期作为字符串时指定的日期格式在哪里

    这与以下问题完全相同从 ResultSet 中以字符串形式读取日期时的默认 JDBC 日期格式 但这个问题从未得到真正的回答 人们只是提供了编写代码的替代方法 我特别询问是否有人知道默认转换格式是在哪里指定的 以及它是否由 JDBC 规范在
  • 如何将 Spring Integration 5 与 Spring Boot 1.5.x 结合使用

    我正在尝试设置一个使用 Spring Boot 1 5 10 和 Spring Integration 的项目 看来Spring Boot 1 5 x使用的是旧版本的Spring Integration 即4 3 14 该项目还需要spri
  • 处理可以处理多点触控吗?

    我是新来的加工我想在 Android 模式下运行我的草图 我希望它同时支持多个触摸 我想知道是否有人可以指导我解决这个问题 如何使我的草图支持多次触摸 这是一个完整的示例 androidMultiTouch pde Shows the ba
  • 在 cygwin/gfortran 下编译 Fortran 程序给出“对‘_WinMain@16’的未定义引用”

    在 Cygwin 终端中我输入 gfortran o threed euler fluxes v3 exe threed euler fluxes v3 f90 我得到编译器错误 usr lib gcc i686 pc cygwin 4 5
  • 尝试使图像在点击时触发功能 - p5.js

    我正在做一个带有交互式画布的艺术课项目 我的目标是让小动物在被点击时发出声音并 移动 我尝试在不创建类的情况下执行此操作 因为由于某种原因我无法在类中使用图像 我正在尝试尽可能轻松地做到这一点 我所说的 移动 是指我试图让背景图像出现在它们
  • 如何在 cy.log() 中打印对象?

    Use case 这是一个用 JS 编码的 Cypress E2E 测试 我正在尝试比较预生产和生产站点地图 URL 内容 以找到差异 我有两个数据集 夹具 一个用于生产 另一个用于测试环境 代码片段 let compareUrlsBetw
  • YouTube API v3 返回截断的观看历史记录

    我可以通过 YouTube v3 数据 API 访问我的观看历史记录 但它仅返回我最近的 30 个视频 尽管当我在 YouTube com 上查看观看历史记录时我会看到更多 然后当我看另一个视频时 它返回31 当我看另一个视频时 它返回32
  • java 版本仍然显示为 1.4 linux

    java version 仍然返回旧的 java 版本 我有红帽Linux 我在以下路径中安装了jdk 1 5并更新了bask配置文件并做了一个源但java版本仍然显示1 4 JAVA HOME usr local jdk jdk1 5 0
  • Google Analytics API V4:includeEmptyRows:“true”,不起作用

    我正在将我的应用程序迁移到 V4 问题是您需要将 includeEmptyRows 设置为 TRUE 这就是我刚刚所做的 然而 空行根本没有填充 function queryReports gapi client request path
  • 使用 ActionMailer 发送带有内嵌图像的 HTML 电子邮件

    我有一个像这样的简单 ActionMailer 类 class MyMailer lt ActionMailer Base def mail from to cc bcc subject message sent at Time now s
  • ImageReader 导致相机滞后

    我面临的问题是 除了用于显示相机输出的 SurfaceView 之外 我还使用 ImageReader 我已经添加了 SurfaceView 本身和 ImageReader 的表面 如下所示 并添加了 ImageReader 侦听器以便接收
  • 具有/不同列数的 vec2mat

    参考使用不同的起始 结束元素数重塑行 Divakar 提出了一个很好的解决方案 但是 如果列数并不总是相同怎么办 样本运行 gt gt A ans 4 9 8 9 6 1 8 9 7 7 7 4 6 2 7 1 gt gt out out
  • 这个执行切入点表达式是如何工作的?

    我遇到了一个answer来自 kriegaex 我无法理解 我试图理解的切入点表达式如下 Around execution MyAnnotation execution MyAnnotation 据我了解 这个表达式将建议任何带有注释的类或
  • 如何使用批处理文件屏蔽输入而不需要额外的文件

    我想要批处理文件用 屏蔽输入而不需要额外的文件 例如 http pastebin com 2c4EtG4g 这段代码运行成功 但是当我写这封信时速度非常慢 任何人都可以给我 代码速度快并且没有额外的文件 或者编辑链接中的代码以加快速度 这符
  • 针对 BlackBerry 上的多种屏幕尺寸进行开发

    Android 和 iOS 具有 密度独立像素 的概念 因此您的布局在不同密度和屏幕尺寸的设备上看起来相同 到目前为止 我已经编写了使用像素手动间隔元素的代码 即我希望此按钮距屏幕左侧 10 个像素 这在曲线上非常棒 但是当我将其加载到粗体
  • 将复杂结构编组到 C#

    我仍在努力将一个相当复杂的结构从 C 编组到 C C 中的结构体如下 typedef struct DWORD Flags DWORD TimeCode DWORD NodeMoving Matrix NodeRots NUM GYROS