zoukankan      html  css  js  c++  java
  • C#结构体和字节数组的转换

    http://www.cnblogs.com/chlyzone/archive/2009/08/08/1541873.html

    在写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;
            //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];
                //分配结构体大小的内存空间
                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 obj = Marshal.PtrToStructure(structPtr, type);
                //释放内存空间
                Marshal.FreeHGlobal(structPtr);
                //返回结构体
                return obj;
            }
    发现自己的不足,善于利用找到的方法去扬长避短。行动起来。
  • 相关阅读:
    python3 TypeError: a bytes-like object is required, not 'str'
    Centos 安装Python Scrapy PhantomJS
    Linux alias
    Vim vimrc配置
    Windows下 Python Selenium PhantomJS 抓取网页并截图
    Linux sort
    Linux RSync 搭建
    SSH隧道 访问内网机
    笔记《鸟哥的Linux私房菜》7 Linux档案与目录管理
    Tornado 错误 "Global name 'memoryview' is not defined"
  • 原文地址:https://www.cnblogs.com/rechen/p/5088835.html
Copyright © 2011-2022 走看看