c#结构体和字节流之间的相互转换
结构体转byte数组
1 首先要明白 ,是 在那个命名空间下 System.Runtime.InteropServices;
2 首先得到结构体的大小
2 开辟相应的内存空间
3 将结构体填充进开辟的内存空间
4 从内存空间拷贝进byte数组
5 不要忘记释放内存哦
public static byte[] StructToBytes(object structObj, int size = )
{
if (size == )
{
size = Marshal.SizeOf(structObj); //得到结构体大小
}
IntPtr buffer = Marshal.AllocHGlobal(size); //开辟内存空间
try
{
Marshal.StructureToPtr(structObj, buffer, false); //填充内存空间
byte[] bytes = new byte[size];
Marshal.Copy(buffer, bytes, , size); //填充数组
return bytes;
}
catch (Exception ex)
{
Debug.LogError("struct to bytes error:" + ex);
return null;
}
finally
{
Marshal.FreeHGlobal(buffer); //释放内存
}
}
同理,接受到的byte数组,转换为结构体
1 开辟内存空间
2 用数组填充内存空间
3 将内存空间的内容转换为结构体
4 同样不要忘记释放内存
public static object BytesToStruct(byte[] bytes, Type strcutType, int nSize)
{
if (bytes == null)
{
Debug.LogError("null bytes!!!!!!!!!!!!!");
}
int size = Marshal.SizeOf(strcutType);
IntPtr buffer = Marshal.AllocHGlobal(nSize);
//Debug.LogError("Type: " + strcutType.ToString() + "---TypeSize:" + size + "----packetSize:" + nSize);
try
{
Marshal.Copy(bytes, , buffer, nSize);
return Marshal.PtrToStructure(buffer, strcutType);
}
catch (Exception ex)
{
Debug.LogError("Type: " + strcutType.ToString() + "---TypeSize:" + size + "----packetSize:" + nSize);
return null;
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
c#结构体和字节流之间的相互转换的更多相关文章
- C# 将结构体转为字节流的方式
1. 将基础类型转为byte数组存储 private byte[] CreateNetDataByteStream(ushort system, ushort host, ushort type, b ...
- C#中结构体与字节流互相转换
1.定义与C++对应的C#结构体 在c#中的结构体不能定义指针,不能定义字符数组,只能在里面定义字符数组的引用. C++的消息结构体如下: //消息格式 4+16+4+4= 28个字节 struct ...
- image和字节流之间的相互转换
//将图片转化为长二进制 public Byte[] SetImgToByte(string imgPath) { FileStream file = new FileStream(imgPath, ...
- Android中Bitmap对象和字节流之间的相互转换
android 将图片内容解析成字节数组,将字节数组转换为ImageView可调用的Bitmap对象,图片缩放,把字节数组保存为一个文件,把Bitmap转Byte import java.io.B ...
- Android中Bitmap对象和字节流之间的相互转换(转)
android 将图片内容解析成字节数组:将字节数组转换为ImageView可调用的Bitmap对象:图片缩放:把字节数组保存为一个文件:把Bitmap转Byte import java.io.Buf ...
- 【C语言入门教程】7.3 结构体指针的定义和引用
C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...
- C#语言struct结构体适用场景和注意事项
在C#语言中struct结构体和class之间的区别主要是值类型和引用类型的区别,但实际上如果使用不当是非常要命的.从Win32时代过来的人对于struct一点不感觉陌生,但是却反而忽略了一些基本问题 ...
- c++入门之初话结构体
结构体是一种具有一定数据结构思想的数据类型,我们在对待结构体的时候,用该从数据结构的思想去审视结构体.下面给出结构体的定义 struct mystruct {]; int score; double ...
- Linux C语言结构体-学习笔记
Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...
随机推荐
- CentOS设置PPTP拨号连接远程服务器
本次测试在Ucloud云服务器从香港连接至广州服务器 1,环境及配置查看 2,安装ppp,pptp,pptp-setup包 yum install -y ppp pptp pptp-setup 3,使 ...
- response.setContentType()的String参数及对应类型(转)
response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据. 例如web浏览器就是通过MI ...
- Oracle Schema Objects——Tables——Oracle Data Types
Oracle Schema Objects Oracle Data Types 数据类型 Data Type Description NUMBER(P,S) Number value having a ...
- HDU2855—Fibonacci Check-up
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 题目意思:求一个式子g[n]=∑C(n,k)*f[k],n很大,很明显是一个矩阵快速幂.可以打表 ...
- iOS 常用框架介绍
iOS框架介绍 Cocoa Touch GameKit 实现对游戏中心的支持,让用户能够在线共享他们的游戏相关的信息 iOS设备之间蓝牙数据传输 从iOS7开始过期 局域网游 ...
- datasnap rest Windows客户端编写
首先吐槽一下XE关于datasnap的资料真的是太少了... 服务端用DSHTTPService1控件可以实现http接口方式的调用,返回的都是json格式数据,适用于跨平台解析. 这里着重强调一下d ...
- 权限认证与授权(Shrio 框架)
权限概述 认证: 系统提供的用于识别用户身份的功能, 通常登录功能就是认证功能; -- 让系统知道你是谁 授权: 系统授予用户可以访问哪些功能的证书. -- 让系统知道你能做什么! 常见的权限控制方式 ...
- java基础02
使用 myeclipse写第一个java程序 之后 右键 点击 src 创建 Class /** * package:包的声明! * 代表我们当前的java源文件在项目中的位置! * 必须位于除了 ...
- 吉哥系列故事——完美队形II---hdu4513(最长回文子串manacher)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 题意比最长回文串就多了一个前面的人要比后面的人低这个条件,所以在p[i]++的时候判断一下s[i ...
- Linux下的内核模块机制
2017-06-20 Linux的内核模块机制允许开发者动态的向内核添加功能,我们常见的文件系统.驱动程序等都可以通过模块的方式添加到内核而无需对内核重新编译,这在很大程度上减少了操作的复杂度.模块机 ...