C#与C++数据类型比较及结构体转换

最近经常用到与C++相互调用,这就涉及到两种语言的数据类型互相转换
不知道的时候就到处查找资料,今天又遇到了C++中TCHAR转换成C# string
一开始不懂,直接找资料转换成以下代码

C++结构体定义:

//登录命令
#define MDM_MB_LOGON                100     //广场登录
#define SUB_MB_LOGON_VISITOR        5       //游客登录

#define LEN_MACHINE_ID              33  //序列长度
#define LEN_MOBILE_PHONE            12      //移动电话

//游客登录
struct CMD_MB_LogonVisitor
{
    //系统信息
    WORD                            wModuleID;                          //模块标识
    DWORD                           dwPlazaVersion;                     //广场版本
    BYTE                            cbDeviceType;                       //设备类型

    //连接信息
    TCHAR                           szMachineID[LEN_MACHINE_ID];        //机器标识
    TCHAR                           szMobilePhone[LEN_MOBILE_PHONE];    //电话号码
};

翻译成C#结构体:

public struct CMD_MB_LogonVisitor
{
    public ushort wModuleID;
    public uint dwPlazaVersion;
    public byte cbDeviceType;
    public string szMachineID;
    public string szMobilePhone;
}
        //struct转换为byte[]
        public static byte[] StructToBytes(object structObj)
        {
            int size = Marshal.SizeOf(structObj);
            IntPtr buffer = Marshal.AllocHGlobal(size);

            try
            {
                Marshal.StructureToPtr(structObj, buffer, false);
                byte[] bytes = new byte[size];
                Marshal.Copy(buffer, bytes, 0, size);
                return bytes;
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

        //byte[]转换为struct
        public static object BytesToStruct(byte[] bytes, Type type)
        {
            int size = Marshal.SizeOf(type);
            IntPtr buffer = Marshal.AllocHGlobal(size);

            try
            {
                Marshal.Copy(bytes, 0, buffer, size);
                return Marshal.PtrToStructure(buffer, type);
            }
            finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

通过StructToBytes转换成byte[]大小为32
服务器解析后数据不对,后面两个字符串长度不匹配
经过百度后,C++中TCHAR 要加[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]

https://www.cnblogs.com/shuenjian901/p/3408514.html

最终结果:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct CMD_MB_LogonVisitor
{
    /// WORD->unsigned short
    public ushort wModuleID;

    /// DWORD->unsigned int
    public uint dwPlazaVersion;

    /// BYTE->unsigned char
    public byte cbDeviceType;

    /// TCHAR[33]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)]
    public string szMachineID;

    /// TCHAR[12]
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
    public string szMobilePhone;
}

这个代码不是自己写的,是生成的
在查找问题过程中得知P/Invoke Interop Assistant这个工具,对不熟悉C++的太有用了
输入C++结构体定义,自动生成C#代码,支持VB,C#

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,067评论 19 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,667评论 8 265
  • 【成都•国宝】 文\小美 你,也许不懂忧伤 在竹林墅中 漫步、嬉戏、翻滚 犹如无忌的童年 永远停留 你,可能...
    小美的诗和远方阅读 232评论 1 1
  • 发生群体:初入市的投资者,分析师,甚至老手也会发生的事,在保证金交易中,如果设了止损位,往往是被打掉而亏损的,出手...
    交易指南针阅读 473评论 0 0
  • 七墨是:浓、淡、泼、破、积 、焦、宿。重点说以下两种:1、积墨法。简单说即是层层递加。要点有三: ①第一遍干后再加...
    半樵阅读 1,338评论 4 19