C# 将结构体转化为byte数组,byte数组转化为结构体
1.将结构体转化为byte数组
#region /// <summary>/// 结构体转为byte数组/// </summary>/// <typeparam name="T"></typeparam>/// <param name="obj"></param>/// <returns></returns>public static byte[] StructToBytes<T>(T obj){int size = Marshal.SizeOf(typeof(T));IntPtr bufferPtr = Marshal.AllocHGlobal(size);try{Marshal.StructureToPtr(obj, bufferPtr, false);byte[] bytes = new byte[size];Marshal.Copy(bufferPtr, bytes, 0, size);return bytes;}catch (Exception ex){throw new Exception("Error in StructToBytes ! " + ex.Message);}finally{Marshal.FreeHGlobal(bufferPtr);}}#endregion
2.byte数组转化为结构体
#region 方法2.byte数组转化为结构体/// <summary>/// byte数组转化为结构体/// </summary>/// <param name="bytes"></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;}#endregion
3.将结构体转化为数组后写入dat文件
byte[] b = StructToBytes<userguanbiao>(ugb);//将结构体转化为byte数组writeBATFiles(b);//将数组写入dat文件
4.从文件中读取数组并转化为结构体显示
#region button1.读取dat文件并转化为结构体public void button1_Click(object sender, EventArgs e){string filePath = Application.StartupPath;FolderBrowserDialog path = new FolderBrowserDialog();path.ShowDialog();string endfilePath = path.SelectedPath;if (Directory.Exists(endfilePath) && Directory.Exists(filePath)){MoveFile(endfilePath, filePath);}else{MessageBox.Show("路径不存在!");return;}Array.Clear(lt,0,12);tanknum = 0;Array.Clear(lt1, 0, 1);byte[] bytData = readBATFile();//以字节数组形式读出dat文件if (bytData == null){MessageBox.Show("tanktable.dat文件不存在,请先生成tanktable.dat,或者将该文件复制到程序运行目下!");return;}userguanbiao lol =(userguanbiao)BytesToStuct(bytData,typeof(userguanbiao));//把数组转化为结构体ugb = lol;DataTable dt = new DataTable();dt.Columns.Add("tankno", typeof(string)); //数据类型为 文本dt.Columns.Add("tankH", typeof(string)); //数据类型为 文本dt.Columns.Add("tankCap", typeof(string)); //数据类型为 文本dt.Columns.Add("totalH", typeof(string)); //数据类型为 文本dt.Columns.Add("ID", typeof(string)); //数据类型为 文本for (int i = 0; i < lol.ltPonsion.Length; i++){int littleid = 1;if (lol.ltPonsion[i].number != 0){for (int k = 0; k < lol.ltPonsion[i].number; k++){dt.Rows.Add((i + 1).ToString(), lol.ltPonsion[i].guangao[k].ToString(), lol.ltPonsion[i].guanrong[k].ToString(), lol.ltPonsion[i].guangao[lol.ltPonsion[i].number - 1].ToString(), littleid.ToString());//Add你们参数的数据顺序要和dt中的列顺对应littleid++;}tanknum++;}lt[i] = lol.ltPonsion[i];}readdts = dt;dgvStruct.DataSource = dt;}#endregion
C# 将结构体转化为byte数组,byte数组转化为结构体相关推荐
- 数组,结构体初始化为0
一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1. 调试的时查看内存发现不是那么一回事,翻了一下<The C++ Pr ...
- 【C语言指针】 指针+-整数、指针-指针、解引用、指针数组、二级指针、结构体声明、初始化、传参
目录 一.指针 1.指针是什么 1.1.一个单元1个字节 2.指针和指针类型 2.1.指针类型的意义 ① 解引用 ② + -整数 例:把每个整形里放1 每个字节里放1 总结: 3.野指针 3.1.野指 ...
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组...
一.程序 现实生活中,程序是指完成某些事务的一种既定方法和过程,可以把程序看成是一系列动作执行过程的描述. 在计算机世界,程序是指令,即为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集 ...
- golang常用库之mapstructure包 | 多json格式情况解析、GO json 如何转化为 map 和 struct、Go语言结构体标签(Struct Tag)
文章目录 golang常用库之mitchellh/mapstructure包 | go将map转换为struct 一.msgpack 二.背景 三.多json格式情况解析使用思路 四.mapstruc ...
- c语言用数组直接填充结构体,C语言第11题:结构体数组的定义与使用 + 结构体数组排序...
C语言第11题:结构体数组的定义与使用 + 结构体数组排序 C语言第11题:结构体数组的定义与使用 + 结构体数组排序 注意: 一下赋值是不能使用的 但是在结构体中是可以直接进行赋值操作的 st[1] ...
- 结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法
结构体中最后一个成员为[0]长度数组的用法:这是个广泛使用的常见技巧,常用来构成缓冲区.比起指针,用空数组有这样的优势:(1).不需要初始化,数组名直接就是所在的偏移:(2).不占任何空间,指针需要占 ...
- 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式
打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[ ...
- 中的数组怎么转成结构体_PLC知识,什么是数组和结构体?
今天给大家介绍一下什么是数组,什么是结构体,关于数组我们会介绍数组的定义.它的使用方法,关于结构体我们会介绍结构体的使用.怎么去建立一个结构体等知识,之前也是有部分学员有问过这些问题的,那么都一块儿给 ...
- C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)
文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...
最新文章
- 图像拼接--Fish-Eye Lenses-Based Camera Calibration and Panoramic Image Stitching
- 类的方法(通过引用来传递参数)
- Chromium浏览器之渲染引擎Blink
- 为什么截屏不能分享微信_为什么腾讯可以在移动端QQ做到闪照,而在Windows桌面端做不到?...
- Java实现xml与map互转
- [转载] 将整数k转换成实数python表达式_Python程序设计课后习题答案-第一单元
- 嵌入式Linux开发笔试,嵌入式Linux工程师笔试题
- 第5讲 zend原理深度剖析
- 经典Java入门视频教程免费下载
- 知了课堂 python_知了课堂Python Flask系列(1)-基础篇 flask视频教程下载
- 10的n次方换算关系 10^N 计算机存储单位的换算关系
- Photoshop 2022下载安装+6大新功能教程初体验
- word安全模式解除
- 需要一款管理链接的软件
- 如何申请CSDN博客专栏
- Python调用阿里API进行车牌识别
- (EKL)elasticsearch
- NVIDIA CUDA初级教程(P2-P3)CPU体系架构概述、并行程序设计概述
- 初识AS3(十)——加载外部文件进度…
- Windows下设置桌面壁纸的代码(QT版)