C# 将结构体转为字节流的方式
1、 将基础类型转为byte数组存储
private byte[] CreateNetDataByteStream(ushort system, ushort host, ushort type, byte[] tx_buf, ushort msg_len, ushort flag) { if (tx_buf == null) { return null; } try { byte[] data = new byte[msg_len + NetDataHeadLen]; byte[] u16byte = new byte[]; u16byte = BitConverter.GetBytes(type); Array.Copy(u16byte, , data, , ); u16byte = BitConverter.GetBytes(flag); Array.Copy(u16byte, , data, , ); u16byte = BitConverter.GetBytes(msg_len); Array.Copy(u16byte, , data, , ); // u16byte = BitConverter.GetBytes(CommonConstant.MySystemID); Array.Copy(u16byte, , data, , ); // u16byte = BitConverter.GetBytes((ushort)CommonConstant.MySeatName); Array.Copy(u16byte, , data, , ); u16byte = BitConverter.GetBytes(system); Array.Copy(u16byte, , data, , ); u16byte = BitConverter.GetBytes(host); Array.Copy(u16byte, , data, , ); tx_buf.CopyTo(data, NetDataHeadLen); return data; } catch {
return null; } }
2.C#中结构体 与 字节流 相互转化
方式一
//将一个结构序列化为字节数组
private IFormatter formatter = new BinaryFormatter();
private ValueType deserializeByteArrayToInfoObj(byte[] bytes)
{
ValueType vt;
if (bytes == null || bytes.Length == )
{
return null;
} try
{
MemoryStream stream = new MemoryStream(bytes);
stream.Position = ;
stream.Seek(, SeekOrigin.Begin);
vt = (ValueType)formatter.Deserialize(stream);
stream.Close();
return vt;
}
catch (Exception ex)
{
return null;
}
}
//将一个结构序列化为字节数组
private byte[] serializeInfoObjToByteArray(ValueType infoStruct)
{
if (infoStruct == null)
{
return null;
} try
{
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, infoStruct); byte[] bytes = new byte[(int)stream.Length];
stream.Position = ;
int count = stream.Read(bytes, , (int)stream.Length);
stream.Close();
return bytes;
}
catch (Exception ex)
{
return null;
}
}
方式二
/// <summary>
/// 将字节数组转换为结构体
/// </summary>
/// <param name="bytes"></param>
/// <param name="type"></param>
/// <returns></returns>
public object ByteaToStruct(byte[] bytes, Type type)
{
//得到结构体大小
int size = Marshal.SizeOf(type);
Math.Log(size, ); if (size > bytes.Length)
return null;
//分配结构大小的内存空间
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将BYTE数组拷贝到分配好的内存空间
Marshal.Copy(bytes, , structPtr, size);
//将内存空间转换为目标结构
object obj = Marshal.PtrToStructure(structPtr, type);
//释放内容空间
Marshal.FreeHGlobal(structPtr);
return obj;
}
/// <summary>
/// 将结构转换为字节数组
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public byte[] StructTOBytes(object obj)
{
int size = Marshal.SizeOf(obj);
//创建byte数组
byte[] bytes = new byte[size];
IntPtr structPtr = Marshal.AllocHGlobal(size);
//将结构体拷贝到分配好的内存空间
Marshal.StructureToPtr(obj, structPtr, false);
//从内存空间拷贝到byte数组
Marshal.Copy(structPtr, bytes,, size);
//释放内存空间
Marshal.FreeHGlobal(structPtr);
return bytes;
}
3. C# 结构体字节对齐
[structLayout(Layoutkind.sequential,charset=charset.ansi)]
Struct Mystruct
{
[MarshalAs(UnmanagedType.ByValArray,sizeConst=)]
Public byte[] serial;
Public byte Type;
Public uint Sum;
}
在上述结构体与字节流转换第二种方法中,获取结构体长度int size = Marshal.SizeOf(Mystruct);,并不是13,而是16。在内存特定类型数据结构起始地址通常有一定的对齐要求,比如32位机器的int起始地址必须是4的整数倍,结构通常也如此
需要添加[structLayout(Layoutkind.sequential,charset=charset.ansi,pack=1)]
C# 将结构体转为字节流的方式的更多相关文章
- 使用unsafe.Pointer将结构体转为[]byte
package main import ( "fmt" "unsafe" ) type TestStructTobytes struct { data int6 ...
- C#中结构体与字节流互相转换
1.定义与C++对应的C#结构体 在c#中的结构体不能定义指针,不能定义字符数组,只能在里面定义字符数组的引用. C++的消息结构体如下: //消息格式 4+16+4+4= 28个字节 struct ...
- c#结构体和字节流之间的相互转换
结构体转byte数组 1 首先要明白 ,是 在那个命名空间下 System.Runtime.InteropServices; 2 首先得到结构体的大小 2 开辟相应的内存空间 3 将结构体填 ...
- 使用xorm将结构体转为sql文件
操作步骤 (1)定义结构体 type User struct { Id int //表id Name string //姓名 ...}12345(2)编写代码,执行自动增量同步(mysql为例) im ...
- C++结构体对象数组的二进制方式读写
以一个学生信息的结构体数组为例. #include<iostream>#include<string>#include<fstream>using namespac ...
- C#中结构体定义并转换字节数组
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...
- C# 结构体定义 转换字节数组 z
客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性. [StructLayoutAttribute(LayoutKind.Sequent ...
- GO学习-(38) Go语言结构体转map[string]interface{}的若干方法
结构体转map[string]interface{}的若干方法 本文介绍了Go语言中将结构体转成map[string]interface{}时你需要了解的"坑",也有你需要知道的若 ...
- p/invoke碎片,对结构体的处理
结构体的一些相关知识 可直接转换类类型,比如int类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...
随机推荐
- 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
[题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...
- 使用Mybatis进行连表查询、left join---https://blog.csdn.net/jinzhencs/article/details/51980518
使用Mybatis进行连表查询.left join https://blog.csdn.net/jinzhencs/article/details/51980518
- 查看表空间使用率及shrink 表空间
首先,可以通过下面的sql statement来查看表空间的使用情况.注意,该语句是在10g下测试过. SELECT FREE.TABLESPACE_NAME, FREE.FREE_SPACE/TOT ...
- Java实现打印功能-AWT Graphics2D
Java实现打印功能 用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Gra ...
- ObjectiveC开发教程--字符串的连接
NSString *type = @"hello"; NSString *subtype = @"good"; NSString *typesub = [NSS ...
- Android 高仿 频道管理----网易、今日头条、腾讯视频 (能够拖动的GridView)附源代码DEMO
距离上次公布(android高仿系列)今日头条 --新闻阅读器 (二) 相关的内容已经半个月了.近期利用空暇时间,把今日头条client完好了下.完好的功能一个一个所有实现后.就放整个源代码.开发的进 ...
- 第16章 ASP.NET MVC 日志篇
本章主要介绍MVC中内置的错误处理.日志以及用来提升性能的监控工具 一.错误处理 当该网站忙于处理HTTP请求时,很多内容都会出错.幸运的是,MVC让错误处理工作变得相对简单了很多,因为MVC应用是运 ...
- 浅析C++多重继承
继承是面向对象的三大特征之中的一个. 可是对于继承的实现和使用方式,各种不同的面向对象语言有各自的观点.有些语言支持多重继承.而有些语言则仅仅支持单一继承. 多重继承的确引入了较大的复杂度.那么.在不 ...
- 微信前端js sdk以外的开发
此时页面中就会出现刚才我画红圈部分的工具条. 这个工具条再加上上面的标题栏工具条. 极大的降低了可视区域的面积. 是否能将它去掉呢?答案是能够的.增加以下代码就能够去掉微信中以下的工具条: docum ...
- iOS UITextView 高度随文字自己主动添加,并尾随键盘移动(二)
上节地址:http://blog.csdn.net/lwjok2007/article/details/47401293 接着上节我们来实现 输入框自己主动调节高度 首先,我们得知道,要推断是否该换行 ...