c#数据结构转c++指针

2023-11-18

C#string转c++ char*

C#使用IntPtr类型接受Marshal.StringToHGlobalAnsi分配的内存。

string sno = ""12345;
IntPtr strsno = Marshal.StringToHGlobalAnsi(sno);
Marshal.FreeHGlobal(strsno);//必须释放

IntPtr转string

string msg = Marshal.PtrToStringAnsi((IntPtr)pmsg);

结构体的转换 c#结构体和对应的c++结构体如下

    [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct SerialPort
    {
        public byte comno;
        public byte btParity;
        public byte btByteSize;
        public byte btStopBits;
        public uint dwBaudRate;
    };
typedef struct tagSerialPort
{
    unsigned char	comno;
    unsigned char	btParity;
    unsigned char	btByteSize;
    unsigned char	btStopBits;
    unsigned int	dwBaudRate;
} _SERIAL_PORT;

转换代码如下

SerialPort SerialPort = new SerialPort();
SerialPort.comno = (byte)4;
SerialPort.dwBaudRate = 15200;
SerialPort.btStopBits = (byte)0;
SerialPort.btByteSize = (byte)8;
SerialPort.btParity = (byte)0;
//convert
IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(SerialPort));
IntPtr structPtr = Marshal.AllocHGlobal(Marshal.SizeOf(SerialPort));
Marshal.StructureToPtr(SerialPort, structPtr, false);
Marshal.FreeHGlobal(structPtr);//释放

如果c++结构体中有数组,最常见的为char[],改如何定义呢

我们再看一个数据库信息的结构体

c++定义的结构体如下

#define IP_SIZE					16
#define	NAME_SIZE				32

typedef struct DatabaseInfo
{
    char	szDbName[NAME_SIZE];
    char	szDbIP[IP_SIZE];
    char	szUser[NAME_SIZE];
    char	szPWd[NAME_SIZE];
    int		nPort;
    char	szCharacter[IP_SIZE];
    int		nType;
} _DatabaseInfo;

C#结构体定义时,用string对应char[],但是一定要指定长度。

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct DatabaseInfo
{
    //字符串,SizeConst为字符串的最大长度
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string szDbName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string szDbIP;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string szUser;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
    public string szPWd;
    public int nPort;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
    public string szCharacter;        
    public int nType;
    //int数组,SizeConst表示数组的个数,在转换成
    //byte数组前必须先初始化数组,再使用,初始化
    //的数组长度必须和SizeConst一致,例test = new int[6];
    //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    //public int[] test;
}

转换代码如下

DatabaseInfo dbInfo = new DatabaseInfo();
dbInfo.szDbName ="igpsport";
//.....dbInfo赋值
//分配结构体大小的内存空间
int size = Marshal.SizeOf(dbInfo);
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷到分配好的内存空间
Marshal.StructureToPtr(dbInfo, structPtr, false);
//do something

//释放内存空间
Marshal.FreeHGlobal(structPtr);

C#中IntPtr为null的判断

 //声明空指针
IntPtr pAdd = IntPtr.Zero;

if(pAdd == IntPtr.Zero)
{

}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c#数据结构转c++指针 的相关文章

  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • ZLIB 解压缩

    我编写了一个小型应用程序 该应用程序应该解压缩以 gzip deflate 格式编码的数据 为了实现这一点 我使用 ZLIB 库 使用解压缩功能 问题是这个功能不起作用 换句话说 数据不是未压缩的 我在这里发布代码 int decompre
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 在 C# 中将位从 ulong 复制到 long

    所以看来 NET 性能计数器类型 http msdn microsoft com en us library system diagnostics performancecounter aspx有一个恼人的问题 它暴露了long对于计数器
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • WPF/数据集:如何通过 XAML 将相关表中的数据绑定到数据网格列中?

    我正在使用 WPF DataSet 连接到 SQL Server Express XAML 和 C Visual Studio 2013 Express 我从名为 BankNoteBook 的现有 SQL Server Express 数据

随机推荐

  • kill 命令 killall pkill

    killall 命令 Linux系统中的killall命令用于杀死指定名字的进程 kill processes by name 我们可以使用kill命令杀死指定进程PID的进程 如果要找到我们需要杀死的进程 我们还需要在之前使用ps等命令再
  • L1-071 前世档案 (20 分)–PAT 团体程序设计天梯赛 GPLT

    include
  • ES6 Promise详解

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Android Studio工具使用技巧

    作为一个Android开发者 熟练使用开发工具能让你工作效率提高 能让你少点加班 剩下时间学习其他的知识 是个多么好的事情 想高级攻城狮方向迈进 不费话了 直接进去主题 一 模版 1 1 for循环的使用 遍历集合的时候 对象 for就可以
  • 使用Python构建强大的网络爬虫

    介绍 网络爬虫是从网站收集数据的强大技术 而Python是这项任务中最流行的语言之一 然而 构建一个强大的网络爬虫不仅仅涉及到获取网页并解析其HTML 在本文中 我们将为您介绍创建一个网络爬虫的过程 这个爬虫不仅可以获取和保存网页内容 还可
  • 【满分】【华为OD机试真题2023 JAVA&JS】字符串重新排序

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 字符串重新排序 知识点排序数组 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 给定一个字符串s s包含以空格分隔的若干个单词 请对s进行如下处理后输出 1 单词
  • ctfshow web171-174

    Web 171 打开发现以下内容 看到了一个查询语句 于是认真看了一下 拼接sql语句查找指定ID用户 sql select username password from user where username flag and id GE
  • shell脚本中$#、$*、$@、$?、$0-n等含义一次性搞明白!!!

    一 Shell脚本变量的含义 1 表示执行脚本传入参数的个数 2 表示执行脚本传入参数的列表 不包括 0 3 表示进程的id Shell本身的PID ProcessID 即脚本运行的当前 进程ID号 4 Shell最后运行的后台Proces
  • 了解少儿编程和机器人编程的区别

    最近少儿编程已经成了炽手可热的培训 不过很多家长也在网上看到有很多网站也提到了机器人编程 这就让很多家长纳闷了 都是编程少儿编程和机器人编程有什么区别呢 现在我们就一起和南京小码王少儿编程培训机构来看下吧 一 少儿编程和机器人编程是什么 机
  • 看天气WeatherCan V1.0 ---气象数据分析系统web版

    版权声明 本文为CSDN博主 老郭1 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net HZGJF article details 104772394 Wea
  • 电脑睡眠,休眠,关闭硬盘的区别

    最近在设置电源选项是对电脑睡眠 休眠 关闭硬盘不太了解 就上网查了一下 睡眠是一种节能状态 睡眠可保存所有打开的文档和程序 当您希望再次开始工作时 可使计算机快速恢复全功率工作 通常在几秒钟之内 使计算机进入睡眠状态就像是暂停DVD 播放器
  • 支付宝转账有“后悔药”了 遇诈骗这样做可冻结资金

    在支付宝上转完账猛然意识到可能是骗子 怎么办 今后 可以 一键 撤回了 昨天 在2018网络安全生态峰会上 蚂蚁金服集团副总裁芮雄文宣布支付宝的延时到账升级为2 0 如果遭遇诈骗 只要延时转账还未到账 及时报警就能冻结交易 一旦警方下达止付
  • C++ primer Plus 第十三章复习题

    1 派生类从基类哪里继承了什么 成员数据 还有一半的成员函数 公有成员和保护成员是可见得 私有成员不可见 2 派生类不能从基类哪里继承什么 构造函数 析构函数 赋值运算符 还有友元函数 都不能继承 3 假设baseDMA operator
  • 大数据毕业设计 深度学习股票预测系统 - python lstm

    文章目录 0 前言 1 课题意义 1 1 股票预测主流方法 2 什么是LSTM 2 1 循环神经网络 2 1 LSTM诞生 2 如何用LSTM做股票预测 2 1 算法构建流程 2 2 部分代码 3 实现效果 3 1 数据 3 2 预测结果
  • 什么是高内聚,低耦合?

    高内聚 低耦合是一个老生常谈的话题 所以拿出来说一下 我们在看Linux的一些资料 或者是在面试 又或者跟一个比较牛的大佬讨论技术的时候 可能会听到这个概念 所以 什么是高内聚 低耦合呢 高内聚 我们指的是认识的一群人或者一些东西分成的一类
  • 第一次从零到有开发项目

    在达内培训中 我们有项目峰会的活动 身为项目组长我组织了我的组员们从零到有进行了一个类CSDN的博客网站开发 目录 项目介绍 项目页面 总结 项目介绍 Kun吧 Kun吧是一个类csdn的学习技术社区 在这里可以交流学习技术 分享学习日常
  • 第十一届蓝桥杯C/C++回文日期

    include
  • 程序员转行做什么工作比较好?

    作为程序员来说 其实程序员的发展之路有多种 你可以结合自己的实际情况去做出相应的选择 程序员最基本的发展路线就是 从普通程序员做到熟练的开发者 接下来就会有多种选择 你可以选择做高级开发工程师 也可以成为一个一线熟练的开发人员 或者你也可以
  • Yolo v7的最简TensorFlow实现

    Yolo v7去年推出之后 取得了很好的性能 作者也公布了基于Pytorch实现的源代码 在我之前的几篇博客当中 对代码进行了深入的解析 了解了Yolo v7的技术细节和实现机制 因为我一直是用的Tensorflow 因此也想尝试把代码移植
  • c#数据结构转c++指针

    C string转c char C 使用IntPtr类型接受Marshal StringToHGlobalAnsi分配的内存 string sno 12345 IntPtr strsno Marshal StringToHGlobalAns