C#结构体和字符数组转换

C#结构体和字节数组转换
在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现: 
1)定义结构体:
    //命名空间
    using System.Runtime.InteropServices;
//注意这个属性不能少
    [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
    structTestStruct
    {
        public int c;
        //字符串,SizeConst为字符串的最大长度
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string str;
        //int数组,SizeConst表示数组的个数,在转换成
        //byte数组前必须先初始化数组,再使用,初始化
        //的数组长度必须和SizeConst一致,例test = new int[6];
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public int[] test;
    }
2)结构体转byte数组:
        //// <summary>
        /// 结构体转byte数组
        /// </summary>
        /// <param name="structObj">要转换的结构体</param>
        /// <returns>转换后的byte数组</returns>
        public static byte[] StructToBytes(object structObj)
      {
            //得到结构体的大小
            int size = Marshal.SizeOf(structObj);
            //创建byte数组
            byte[] bytes = new byte[size];
            //分配结构体大小的内存空间
            IntPtrstructPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
            //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
            return bytes;
        }
百灵功放3byte数组转结构体:
        /// <summary>
        /// byte数组转结构体
        /// </summary>
        /// <param name="bytes">byte数组</param>
        /// <param name="type">结构体类型</param>
        /// <returns>转换后的结构体</returns>
        public static object BytesToStuct(byte[] bytes,Type type)
        {
            //得到结构体的大小
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size >bytes.Length)
            {
                //返回空
                return null;
            }
            //分配结构体大小的内存空间
            IntPtrstructPtr = Marshal.AllocHGlobal(size);
            //byte数组拷到分配好的内存空间
新疆大学学报            Marshal.Copy(bytes,0,structPtr,size);
            //将内存空间转换为目标结构体
            object obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回结构体
            return obj;
        }
C#.NET和C++结构体Socket通信与数据转换
最近在用C#做一个项目的时候,Socket发送消息的时候遇到了服务端需要接收C++结构体的二进制数据流,这个时候就需要用C#仿照C++的结构体做出一个结构来,然后将其转换成二进制流进行发送,之后将响应消息的二进制数据流转换成C#结构。
皮相猎影
1、仿照C++结构体写出C#的结构来
 
 1  using  System.Runtime.InteropServices;
 2  
 3      [Serializable]  //  指示可序列化 
 4      [StructLayout(LayoutKind.Sequential, Pack  =   1 )]  //  按1字节对齐 
 5       public   struct  Operator
 6  
 7       {
 8            public   ushort  id;
 9          [MarshalAs(UnmanagedType.ByValArray, SizeConst  =   11 )]  //  声明一个字符数组,大小为11 
10           public   char [] name;
11          [MarshalAs(UnmanagedType.ByValArray, SizeConst  =   9 )]
12           public   char [] pass;
13  
14            public  Operator( string  user,  string  pass)  //  初始化 
15           {
16               this .id  =   10000 ;
17               this .name  =  user.PadRight( 11 ,  ' /0 ' ).ToCharArray();
18               this .pass  =  pass.PadRight( 9 ,  ' /0 ' ).ToCharArray();
19          } 
20      } 
21  
22 
 
    2、注意C#与C++数据类型的对应关系
 
2013广东高考理综
C++与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
整个结构的字节数是22bytes。
对应的C++结构体是:
 
 
1  typedef  struct 
2  {
3       WORD id;           
4      CHAR name[ 11 ];
5      CHAR password[ 9 ];
6  } Operator;
7  
8 
3、发送的时候先要把结构转换成字节数组
 
 
 1    using  System.Runtime.InteropServices;     
 2  
 3            ///   <summary> 
 4           ///  将结构转换为字节数组
 5           ///   </summary> 
 6           ///   <param name="obj"> 结构对象 </param> 
 7           ///   <returns> 字节数组 </returns> 
 8           public   byte [] StructToBytes( object  obj)
 9           {
10               // 得到结构体的大小 
11               int  size  =  Marshal.SizeOf(obj);
12               // 创建byte数组 
13               byte [] bytes  =   new   byte [size];
14               // 分配结构体大小的内存空间 
15              IntPtr structPtr  =  Marshal.AllocHGlobal(size);
16               // 将结构体拷到分配好的内存空间 
17              Marshal.StructureToPtr(obj, structPtr,  false );
18               // 从内存空间拷到byte数组 
19              Marshal.Copy(structPtr, bytes,  0 , size);
20               // 释放内存空间 
21              Marshal.FreeHGlobal(structPtr);
22               // 返回byte数组 
23               return  bytes;
24  
25         } 
26  
27 
接收的时候需要把字节数组转换成结构
 
 
 1  ///   <summary> 
 2           ///  byte数组转结构
 3           ///   </summary> 
 4           ///   <param name="bytes"> byte数组 </param> 
 5           ///   <param name="type"> 结构类型 </param> 
 6           ///   <returns> 转换后的结构 </returns> 
 7           public   object  BytesToStruct( byte [] bytes, Type type)
 8           {
 9               // 得到结构的大小 
10               int  size  =  Marshal.SizeOf(type);
11              Log(size.ToString(),  1聆听的魅力 );
12               // byte数组长度小于结构的大小 
13               if  (size  >  bytes.Length)
14               {
15                   // 返回空 
16                   return   null ;
17              } 
18               // 分配结构大小的内存空间 
19              IntPtr structPtr  =  Marshal.AllocHGlobal(size);
20               // 将byte数组拷到分配好的内存空间 
21              Marshal.Copy(bytes,  0 , structPtr, size);
22               // 将内存空间转换为目标结构 
23               object  obj  =  Marshal.PtrToStructure(structPtr, type);
24               // 释放内存空间 
25              Marshal.FreeHGlobal(structPtr);
26               // 返回结构 
27               return  obj;
28          } 
29 

本文发布于:2024-09-23 22:24:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/361252.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结构   数组   内存空间   时候   转换   整数   发送
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议