首页 > 编程语言 >C#结构体与byte数组相互转化

C#结构体与byte数组相互转化

时间:2023-03-23 21:35:45浏览次数:35  
标签:structPtr C# 内存空间 数组 byte Marshal size

        /// <summary>
        /// 结构体转byte数组
        /// </summary>
        /// <param name="structObj"></param>
        /// <returns></returns>
        public static byte[] StructToBytes<T>(T structObj) where T : struct
        {
            //得到结构体的大小
            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;
        }

        /// <summary>
        /// byte数组转结构体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="bytes"></param>
        /// <returns></returns>
        public static T BytesToStuct<T>(byte[] bytes) where T : struct
        { 
            //得到结构体的大小
            Type type = typeof(T);
            int size = Marshal.SizeOf(type);
            //byte数组长度小于结构体的大小
            if (size > bytes.Length)
            {
                //返回空
                return default(T);
            }
            //分配结构体大小的内存空间
            IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将byte数组拷到分配好的内存空间
            Marshal.Copy(bytes, 0, structPtr, size);
            //将内存空间转换为目标结构体
            var obj = Marshal.PtrToStructure(structPtr, type);
            //释放内存空间
            Marshal.FreeHGlobal(structPtr);
            if (obj is T t)
            {
                return t;
            }
            return default(T);
        }

标签:structPtr,C#,内存空间,数组,byte,Marshal,size
From: https://www.cnblogs.com/dongweian/p/17249516.html

相关文章

  • 最大子数组和
    题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。输入:nums=[-2,1,......
  • docker容器安装RabbitMQ
    https://blog.csdn.net/qq_45502336/article/details/118699251?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~Rate-1......
  • css绘制一个Pinia小菠萝
    效果如下:pinia小菠萝分为头部和身体,头部三片叶子,菠萝为身体头部先绘制头部的盒子,将三片叶子至于头部盒子中先绘制中间的叶子,利用border-radius实现叶子的效果,可以借......
  • Styled Components 备忘清单_开发速查表分享
    StyledComponents备忘清单IT宝库整理的StyledComponents快速参考备忘单提供了使用CSSinJS工具的各种方法入门,为开发人员分享快速参考备忘单。开发速查表大纲入......
  • P2617 Dynamic Rankings
    我以后再也不乱写字符了啊啊啊!动态区间第K小模板,树状数组维护修改哪些线段树。错误的原因:1、树状数组询问的时候x和y忘了套上root2、字符乱判,万紫千红3、离散化......
  • Styled Components 备忘清单_开发速查表分享
    StyledComponents备忘清单IT宝库整理的StyledComponents快速参考备忘单提供了使用CSSinJS工具的各种方法入门,为开发人员分享快速参考备忘单。开发速查表大纲入......
  • 回收 Mac 微信权限
    回收Mac微信权限参考链接:8.71AtE:/一款软件在我们的电脑上暗地里做了什么,大部分情况下我们都是不知道的,但是如果被我发现了,嘿嘿,我就回收你的权限!#网络安全#程序员......
  • 高可用K8S集群中Master加入集群的时候报错:error execution phase check-etcd:解决方法
    报错信息:  报错原因:1、这个问题我找了两天没找到,最后找到网络的问题,我做的有双网卡,导致Master02和Master03服务器抢一个虚拟IP。2、Master02先抢到这个IP,Master03......
  • 09、Qt 出现 AutoUic error
    错误:我们将AUTOUIC设置为ON之后,cmake会自动帮我们生成ui文件对应的.h头文件,但是需要ui文件和h文件在同一个目录下。如:src include mainwindow.h mainwindow.ui s......
  • 关于我使用ECharts对地图进行染色渲染不成功的原因以及解决
    问题描述不知道为什么,我弄出来的地图一直只有一个颜色,就一直改变我写代码的内容以及形式,试图通过这种方式解决这个问题,没想到的是,改了好久,地图还是那个地图,我却快要谢了,真......