首页 程序笔记 C#中结构体和byte数组之间的转换

C#中结构体和byte数组之间的转换

前言

在使用C#写通信的程序时,数据只能以byte数组的进行传输,处理起来比较麻烦不说,如果与非托管语言的API交互时,很多的都是传送结构体,在C/C++语言中可以很方便的把一个char[]数组或者内存空间转换为一个结构体,而在C#中却不能直接把byte数组转换为结构体,要在C#中发送结构体,可以按以下方法实现。

实现方法

定义结构体:

 //命名空间
using System.Runtime.InteropServices;

    //注意Pack属性不能少,表示1字节对齐(也可以是4字节对齐,收发双方都需要保持一致)
     [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;
     }

结构体转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;
         }

byte数组转结构体

        /// summary
        /// byte数组转结构体
        /// /summary
        /// param name=bytesbyte数组/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;
         }
2

站心网

前言 在使用C#写通信的程序时,数据只能以byte数组的进行传输,处理起来比较麻烦不说,如果与非托管语言的A..

为您推荐

SqlServer表结构查询

Mysql数据库查询表结构很方便,用客户端(SQLyog)可以直接复制出需要的表结构,据说可以用简单的命令查询表结构 desc 表结构Sqlserver导出表结构就很坑爹了,首先呢客户端不支持,表设计页面虽说可以复制表结构但是..

JS 中彻底删除 JSON 对象组成的数组中的元素

在 JS 中,对于某个由 JSON 对象组成的数组,例如:var test = [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" }];如果我们想要删除其中的第二个json对象,应该怎么做呢?其实方法和操作数..

C#中数组作为参数传递的问题

原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值。如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很难..

CPU、GPU 和 TPU 之间有什么区别?

什么是 CPU、GPU 和 TPU?它们都是用于计算任务的处理器芯片。可以把你的大脑想象成一台计算机,能够完成诸如阅读书籍或解决数学问题的任务。每一项活动都类似于一个计算任务。例如,当你用手机拍照、发送短信或打开..

javascript 6种连接数组的方法和对比

在 JavaScript 中,有多种方法可以用来连接数组,以下是常见的几种:1. concat() 方法用于连接两个或多个数组,返回一个新的数组,不修改原数组。const arr1 = [1, 2, 3];const arr2 = [4, 5, 6];const result = arr..

js 数组方法 - 修改篇

js数组方法可分为三类:修改、访问、迭代。修改:改变原有数组访问:不改变原有数组,从原有数组中获取数据迭代:对数组的每一项进行处理,返回数据本文主要介绍数组的修改篇一、增加1、push()含义:在数组末尾添加..

ASP.NET 使用Entity Framework (EF) 创建迁移修改SQLite数据库表结构

在 ASP.NET 中,使用 Entity Framework (EF) 创建并连接 SQLite 数据库是一种轻量级、高效的数据库管理方式。以下是详细步骤:安装必要的 NuGet 包安装EntityFrameworkCore.Sqlite包:Install-Package Microsoft.Ent..

c#获取两个数组或集合的交集或差集

c#获取两个数组或集合的交集或差集。 不要使用循环,效率肯定低。C#有现成的高性能的获取数组或集合的交集或差集方法:Intersect和Except。 使用Intersect和Except获取两个数组的交集或者差集时性能很高,我测试两个..

C# Word转换成Pdf的方法

ASP.NET将word文档转换成pdf的代码。 一、添加引用 using Microsoft.Office.Interop.Word; 二、转换方法 1、方法 /// <summary> /// 把Word文件转换成pdf文件 /// </summary> /// <param name="sourcePath">需要转..

解释一下MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)模式,并比较它们之间的区别。

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)是两种常见的软件架构模式,用于组织和分离应用程序中的不同部分。它们有一些相似之处,但也有一些明显的区别。MVC模式Model(模型):负责处理应用程序..

.NET byte和string互相转换

在.NET中,可以使用Encoding类来进行字节(byte)和字符串(string)之间的相互转换。这主要依赖于所选择的编码方式。以下是一些示例:将字符串转换为字节数组使用指定的编码方式将字符串转换为字节数组:string myS..

C#使用ToString方法数组类型格式化为字符串

在C#中,很多数值类型的转换为字符串时都会使用到ToString方法,不同的数据类型可以使用一些常见的格式化输出,可以转换为指定的格式,以下总结一下各个基础结构对象的格式化。xxx.ToString(format):格式字符串采用..

C# Winform实现多个窗体之间切换

在C# Winform应用程序开发中,多窗体的切换是一个常见的需求。通过合理的窗体切换,我们可以实现更灵活、友好的用户界面,提升应用程序的用户体验。本文将结合实例详细介绍如何在C# Winform中实现多窗体切换。在C#中..

C++中string字符串类型如何快速进行大小写转换

对于C/C++的初学者,对C/C++中的部分函数或用法不熟悉,字符串的大小写转换是最常用的,当然可以直接写代码通过for循环来做,实际上C++中有很多内建的函数可以用,比如字符串大些转小写或者小写转大写,可以使用tran..

SQL行和列转换查询

Name Subject Result 张三 语文74 张三 数学83 张三 物理93 李四 语文74 李四 数学84 李四 物理94 想变成 姓名 语文 数学 物理 ---------- ----------- ----------- ----------- 李四 74 84 94 张三 74 83 93 creat..

.NET自然语言转换为SQL的Nl2Sql项目

随着技术的发展,人工智能在各个领域的应用已经不再是新鲜事。在数据库查询领域能够自然地将人类语言转换为SQL语句将为不懂技术的人士提供极大的便捷,同时也能大幅提高专业开发者的工作效率。今天,我带大家深入了..

js filter、map、reduce等遍历数组的方法

JavaScript中遍历数组的方法有很多种,其中最常用的有以下几种:1. for 循环const array = [1, 2, 3, 4, 5];for (let i = 0; i < array.length; i++) {console.log(array[i]);}2. forEach() 方法const array = [1, 2..

C/C++语言中socket IP地址的结构体

struct in_addr结构体struct in_addr结构体是C/C++ socket编程中比较常用的结构体,主要是保存IP地址的信息,查看源码可以发现,这个结构体实际上是一个联合体,可以多种形式操作这个结构体。struct in_addr {union ..

C# 开源中文拼音 简繁转换 数字读法 货币转换工具库Chinese

推荐一个功能强大的中文处理库,Chinese 是一个中文解析通用工具,基于 C# 开发,包括拼音,简繁转换,数字读法,货币读法。和其他工具不一样的是,Chinese 可以在本地离线使用,而不需要对接到其他的第三方平台。Ch..

海洋cms生成静态的目录结构调整教程

示例1:内容页路径:[backcolor=yellowgreen]/subtypeEnname/id/[/backcolor]后台第一种目录结构[backcolor=yellowgreen]/typeEnname/id/[/backcolor]在都是顶级分类时生成的是[backcolor=yellowgreen]/dongzuo/1024..

发表回复

返回顶部