码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-20 18:32:38      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:

转发至http://www.blogjava.net/heting/archive/2010/03/20/315998.html

 

技术分享C++            C#
技术分享=====================================
技术分享WORD            ushort
技术分享DWORD            uint
技术分享UCHAR            int/byte   大部分情况都可以使用int代替,而如果需要严格对齐的话则应该用bytebyte 
技术分享UCHAR*            string/IntPtr
技术分享unsigned char*         [MarshalAs(UnmanagedType.LPArray)]byte[]/?(Intptr)
技术分享char*            string
技术分享LPCTSTR            string
技术分享LPTSTR            [MarshalAs(UnmanagedType.LPTStr)] string
技术分享long            int
技术分享ulong               uint
技术分享Handle            IntPtr
技术分享HWND            IntPtr
技术分享void*            IntPtr
技术分享int            int
技术分享int*            ref int
技术分享*int            IntPtr
技术分享unsigned int        uint
技术分享COLORREF                uint 
技术分享
技术分享 
技术分享
技术分享 
技术分享
技术分享API与C#的数据类型对应关系表 
技术分享API数据类型 类型描述 C#类型 API数据类型 类型描述 C#类型 
技术分享WORD 16位无符号整数 ushort CHAR 字符 char 
技术分享LONG 32位无符号整数 int DWORDLONG 64位长整数 long 
技术分享DWORD 32位无符号整数 uint HDC 设备描述表句柄 int 
技术分享HANDLE 句柄,32位整数 int HGDIOBJ GDI对象句柄 int 
技术分享UINT 32位无符号整数 uint HINSTANCE 实例句柄 int 
技术分享BOOL 32位布尔型整数 bool HWM 窗口句柄 int 
技术分享LPSTR 指向字符的32位指针 string HPARAM 32位消息参数 int 
技术分享LPCSTR 指向常字符的32位指针 String LPARAM 32位消息参数 int 
技术分享BYTE 字节 byte WPARAM 32位消息参数 int 
技术分享
技术分享
技术分享 
技术分享
技术分享 
技术分享
技术分享 
技术分享
技术分享BOOL=System.Int32
技术分享BOOLEAN=System.Int32
技术分享BYTE=System.UInt16
技术分享CHAR=System.Int16
技术分享COLORREF=System.UInt32
技术分享DWORD=System.UInt32
技术分享DWORD32=System.UInt32
技术分享DWORD64=System.UInt64
技术分享FLOAT=System.Float
技术分享HACCEL=System.IntPtr
技术分享HANDLE=System.IntPtr
技术分享HBITMAP=System.IntPtr
技术分享HBRUSH=System.IntPtr
技术分享HCONV=System.IntPtr
技术分享HCONVLIST=System.IntPtr
技术分享HCURSOR=System.IntPtr
技术分享HDC=System.IntPtr
技术分享HDDEDATA=System.IntPtr
技术分享HDESK=System.IntPtr
技术分享HDROP=System.IntPtr
技术分享HDWP=System.IntPtr
技术分享HENHMETAFILE=System.IntPtr
技术分享HFILE=System.IntPtr
技术分享HFONT=System.IntPtr
技术分享HGDIOBJ=System.IntPtr
技术分享HGLOBAL=System.IntPtr
技术分享HHOOK=System.IntPtr
技术分享HICON=System.IntPtr
技术分享HIMAGELIST=System.IntPtr
技术分享HIMC=System.IntPtr
技术分享HINSTANCE=System.IntPtr
技术分享HKEY=System.IntPtr
技术分享HLOCAL=System.IntPtr
技术分享HMENU=System.IntPtr
技术分享HMETAFILE=System.IntPtr
技术分享HMODULE=System.IntPtr
技术分享HMONITOR=System.IntPtr
技术分享HPALETTE=System.IntPtr
技术分享HPEN=System.IntPtr
技术分享HRGN=System.IntPtr
技术分享HRSRC=System.IntPtr
技术分享HSZ=System.IntPtr
技术分享HWINSTA=System.IntPtr
技术分享HWND=System.IntPtr
技术分享INT=System.Int32
技术分享INT32=System.Int32
技术分享INT64=System.Int64
技术分享LONG=System.Int32
技术分享LONG32=System.Int32
技术分享LONG64=System.Int64
技术分享LONGLONG=System.Int64
技术分享LPARAM=System.IntPtr
技术分享LPBOOL=System.Int16[]
技术分享LPBYTE=System.UInt16[]
技术分享LPCOLORREF=System.UInt32[]
技术分享LPCSTR=System.String
技术分享LPCTSTR=System.String
技术分享LPCVOID=System.UInt32
技术分享LPCWSTR=System.String
技术分享LPDWORD=System.UInt32[]
技术分享LPHANDLE=System.UInt32
技术分享LPINT=System.Int32[]
技术分享LPLONG=System.Int32[]
技术分享LPSTR=System.String
技术分享LPTSTR=System.String
技术分享LPVOID=System.UInt32
技术分享LPWORD=System.Int32[]
技术分享LPWSTR=System.String
技术分享LRESULT=System.IntPtr
技术分享PBOOL=System.Int16[]
技术分享PBOOLEAN=System.Int16[]
技术分享PBYTE=System.UInt16[]
技术分享PCHAR=System.Char[]
技术分享PCSTR=System.String
技术分享PCTSTR=System.String
技术分享PCWCH=System.UInt32
技术分享PCWSTR=System.UInt32
技术分享PDWORD=System.Int32[]
技术分享PFLOAT=System.Float[]
技术分享PHANDLE=System.UInt32
技术分享PHKEY=System.UInt32
技术分享PINT=System.Int32[]
技术分享PLCID=System.UInt32
技术分享PLONG=System.Int32[]
技术分享PLUID=System.UInt32
技术分享PSHORT=System.Int16[]
技术分享PSTR=System.String
技术分享PTBYTE=System.Char[]
技术分享PTCHAR=System.Char[]
技术分享PTSTR=System.String
技术分享PUCHAR=System.Char[]
技术分享PUINT=System.UInt32[]
技术分享PULONG=System.UInt32[]
技术分享PUSHORT=System.UInt16[]
技术分享PVOID=System.UInt32
技术分享PWCHAR=System.Char[]
技术分享PWORD=System.Int16[]
技术分享PWSTR=System.String
技术分享REGSAM=System.UInt32
技术分享SC_HANDLE=System.IntPtr
技术分享SC_LOCK=System.IntPtr
技术分享SHORT=System.Int16
技术分享SIZE_T=System.UInt32
技术分享SSIZE_=System.UInt32
技术分享TBYTE=System.Char
技术分享TCHAR=System.Char
技术分享UCHAR=System.Byte
技术分享UINT=System.UInt32
技术分享UINT32=System.UInt32
技术分享UINT64=System.UInt64
技术分享ULONG=System.UInt32
技术分享ULONG32=System.UInt32
技术分享ULONG64=System.UInt64
技术分享ULONGLONG=System.UInt64
技术分享USHORT=System.UInt16
技术分享WORD=System.UInt16
技术分享WPARAM=System.IntPtr
技术分享
技术分享<---------补充----------->
技术分享
技术分享Wtypes.h 中的非托管类型    非托管C 语言类型    托管类名       说明 
技术分享HANDLE                        void*                   System.IntPtr  32 位 
技术分享BYTE                            unsigned char       System.Byte    8 位 
技术分享SHORT                         short                    System.Int16   16 位 
技术分享WORD                          unsigned short      System.UInt16  16 位 
技术分享INT                               int                       System.Int32   32 位 
技术分享UINT                             unsigned int         System.UInt32  32 位 
技术分享LONG                            long                    System.Int32   32 位 
技术分享BOOL                            long                    System.Int32   32 位 
技术分享DWORD                        unsigned long       System.UInt32  32 位 
技术分享ULONG                          unsigned long      System.UInt32  32 位 
技术分享CHAR                            char                    System.Char    用 ANSI 修饰。 
技术分享LPSTR                           char*                  System.String 或 System.StringBuilder 用 ANSI 修饰。 
技术分享LPCSTR                         Const char*         System.String 或 System.StringBuilder 用 ANSI 修饰。 
技术分享LPWSTR                        wchar_t*             System.String 或 System.StringBuilder 用 Unicode 修饰。 
技术分享LPCWSTR                      Const wchar_t*    System.String 或 System.StringBuilder 用 Unicode 修饰。 
技术分享FLOAT                           Float                    System.Single 32 位 
技术分享DOUBLE                        Double                 System.Double 64 位 
技术分享
技术分享 
技术分享
技术分享 
技术分享
技术分享C/C++中的结构类型数据在C#下的转换
技术分享
技术分享 
技术分享在做项目移植的时候,经常会碰到数据类型的转换,而我这一次碰到的是C/C++中的结构怎样转换到C#。折腾了一个晚上终于有一个完美的方案。
技术分享例如我们在C/C++下的结构数据如下:
技术分享typedef struct 
技术分享{
技术分享    char sLibName[ 256 ];
技术分享    char sPathToLibrary[ 256 ];
技术分享    INT32        iEntries;
技术分享    INT32        iUsed;
技术分享    UINT16    iSort;
技术分享    UINT16    iVersion;
技术分享    BOOLEAN    fContainsSubDirectories;
技术分享    INT32        iReserved;
技术分享} LIBHEADER;
技术分享我们想把它转成C#下的结构类型如下:
技术分享    public struct LIBHEADER
技术分享    {
技术分享        public char[] sLibName;
技术分享        public char[] sPathToLibrary;
技术分享        public Int32 iEntries;
技术分享        public Int32 iUsed;
技术分享        public UInt16 iSort;
技术分享        public UInt16 iVersion;
技术分享        public Boolean fContainsSubDirectories;
技术分享        public Int32 iReserved;
技术分享    }
技术分享看上去好像没问题了,呵呵呵,其实这样是不行的,我们得再给C#编译器一些信息,告诉它一些字符数组的大小。然后它们在C#下面长得样子就变成这样:
技术分享    [StructLayout(LayoutKind.Sequential)]
技术分享    public struct LIBHEADER
技术分享    {
技术分享        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
技术分享        public char[] sLibName;
技术分享        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
技术分享        public char[] sPathToLibrary;
技术分享        public Int32 iEntries;
技术分享        public Int32 iUsed;
技术分享        public UInt16 iSort;
技术分享        public UInt16 iVersion;
技术分享        public Boolean fContainsSubDirectories;
技术分享        public Int32 iReserved;
技术分享    }
技术分享然后写一个函数负责转换。
技术分享public StructType ConverBytesToStructure<StructType>(byte[] bytesBuffer)
技术分享        {
技术分享            // 检查长度。
技术分享            if (bytesBuffer.Length != Marshal.SizeOf(typeof(StructType)))
技术分享            {
技术分享                throw new ArgumentException("bytesBuffer参数和structObject参数字节长度不一致。");
技术分享            }
技术分享
技术分享            IntPtr bufferHandler = Marshal.AllocHGlobal(bytesBuffer.Length);
技术分享            for (int index = 0; index < bytesBuffer.Length; index++)
技术分享            {
技术分享                Marshal.WriteByte(bufferHandler, index, bytesBuffer[index]);
技术分享            }
技术分享            StructType structObject = (StructType)Marshal.PtrToStructure(bufferHandler, typeof(StructType));
技术分享            Marshal.FreeHGlobal(bufferHandler);
技术分享            return structObject;
技术分享        }
技术分享然后我们的函数用例是这样:
技术分享    FileStream file = File.OpenRead(@"D:\Jagged Alliance 2 Gold\INSTALL.LOG");
技术分享    byte[] buffer = new byte[Marshal.SizeOf(typeof(LIBHEADER))];
技术分享    file.Read(buffer, 0, buffer.Length);
技术分享    LIBHEADER testValue = CommonTools.ConverBytesToStructure<LIBHEADER>(buffer);
技术分享string libName = new string(testValue.sLibName);
技术分享string pathToLibrary= new string(testValue.sPathToLibrary);
技术分享OK,搞定。
技术分享如果想去掉后面两句的char数组的转换哪代码如下
技术分享C#中的结构代码
技术分享    [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
技术分享    public struct LIBHEADER
技术分享    {
技术分享        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
技术分享        public string sLibName;
技术分享        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
技术分享        public string sPathToLibrary;
技术分享        public Int32 iEntries;
技术分享        public Int32 iUsed;
技术分享        public UInt16 iSort;
技术分享        public UInt16 iVersion;
技术分享        public Boolean fContainsSubDirectories;
技术分享        public Int32 iReserved;
技术分享    }
技术分享其它代码不用作修改便可使用。

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

标签:

原文地址:http://www.cnblogs.com/Iyce/p/4745863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!