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

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)
{

}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值