`
pcajax
  • 浏览: 2106256 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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)]
    struct TestStruct
    {
 public int c;
//字符串,SizeConst为字符串的最大长度
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string str;ITPUB个人空间9H]
        //int数组,SizeConst表示数组的个数,在转换成
        //byte数组前必须先初始化数组,再使用,初始化
       //的数组长度必须和SizeConst一致,例test = new int[6];
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        public int[] test;
 }

(2)结构体转byte数组:
   //// <summary>ITPUB个人空间hUH b? X
        /// 结构体转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];
            //分配结构体大小的内存空间
          IntPtr structPtr = Marshal.AllocHGlobal(size);
          //将结构体拷到分配好的内存空间
            Marshal.StructureToPtr(structObj, structPtr, false);
          //从内存空间拷到byte数组
         Marshal.Copy(structPtr, bytes, 0, size);
           //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            //返回byte数组
         return bytes;
        }
(3)byte数组转结构体:
   /// <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;
         }
         //分配结构体大小的内存空间
     IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes,0,structPtr,size);
            //将内存空间转换为目标结构体
            object bj = Marshal.PtrToStructure(structPtr, type);
          //释放内存空间
      Marshal.FreeHGlobal(structPtr);
            //返回结构体
            return obj;
        }

分享到:
评论

相关推荐

    C#【泛型】实现的【通用】结构体转字节数组

    C#【泛型】实现的【通用】结构体转字节数组,包含网上收集的网页参考资料、非通用的【StructTest】工程、泛型实现的通用【Struct2BytesGenericType】工程。 VS2010编译运行。

    C#中结构体和字节数组转换实现

    主要介绍了C#中结构体和字节数组转换实现,本文直接给出了字节数组与结构体的转换代码,代码中包含详细注释,需要的朋友可以参考下

    C#结构体和C++字节数组的转换

    在写C#TCP通信程序时,发送数据时,只能发送byte数组,处理起来比较麻烦不说,如果是和VC6.0等写的程序通信的话,很多的都是传送结构体,在VC6.0中可以很方便的把一个char[]数组转换为一个结构体,而在C#却不能直接...

    C#中结构体定义并转换字节数组详解

    最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换;由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一点非常重要...

    C#中结构体struct和字节数组Byte的之间的转换函数

    在tcp通讯的时候经常会遇到 struct传输的情况。但是C#中tcp只能传送byte[]类型,于是struct与byte相互转化就成为了一个麻烦的事情,这里提供两个方法。

    C#byte数组与Image的相互转换实例代码

    2、把从数据库读取的byte数组转换为Image对象,赋值给相应的控件显示。 3、从图片byte数组得到对应图片的格式,生成一张图片保存到磁盘上。 这里的Image是System.Drawing.Image。 //Get an image from file Image...

    基于C#调用c++Dll结构体数组指针的问题详解

    C#调用c++dll文件是一件很麻烦的事情,首先面临的是数据类型转换的问题,相信经常做c#开发的都和我一样把学校的那点c++底子都忘光了吧(语言特性类)。 网上有一大堆得转换对应表,也有一大堆的转换实例,但是都没有...

    C#搞工控的一些代码.zip_C#工控代码_C#搞工控的一些代码_串口_数据库转换_转浮点

    1、字节转化为单精度浮点数 2、单精度转成字节 3、使用结构体 4、使用动态链接库 5、ASCCII码字符转成16进制数 ...8、整形数据与字节数组相互转换 9、ASCII码的使用,适用于串口通信 10、c#获得时间和路径?

    C#调用C++版本dll时的类型转换需要注意的问题小结

    C#对于C++的dll引用时,经常会遇到类型转换和struct的转换 1. C++ 里的Char类型是1 个字节,c#里的Char是两个字节,不可以对应使用;可使用c#里的byte对应 2. structType temp = (structType)Marshal.PtrToStructure...

    C#如何从byte[]中直接读取Structure实例详解

    去年年尾的样子,我阅读学习某C++开发的程序源码时,发现作者用了一个很骚的操作直接将byte[]数组转为了结构体对象: 上面的data变量是一个指向unsigned char类型的指针,就只要一个简单的类型转换就可以将一堆...

Global site tag (gtag.js) - Google Analytics