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类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...
随机推荐
- 九度oj 题目1078:二叉树遍历
题目1078:二叉树遍历 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5326 解决:3174 题目描述: 二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历 ...
- [luoguP2904] [USACO08MAR]跨河River Crossing(DP)
传送门 f[i] 表示送前 i 头牛过去再回来的最短时间 f[i] = min(f[i], f[j] + sum[i - j] + m) (0 <= j < i) ——代码 #includ ...
- [bzoj 1005][HNOI 2008]明明的烦恼(prufer数列+排列组合)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1005 分析: 首先prufer数列:http://baike.baidu.com/view/1 ...
- - > 网络流(【最大流】草地排水模板题)
1993 草地排水 USACO 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在农夫约翰的农场上,每 ...
- Ubuntu 16.04安装NASM汇编IDE-SASM
在Linux下,尤其是Ubuntu,SASM工具应该是用来开发汇编最好用的IDE,小巧且支持调试.支持的编译器有:NASM, MASM, GAS, FASM. 安装步骤: 下载: http://dow ...
- Ubuntu下常规方法安装软件
一.通过apt-get 搜索: #搜索 apt-cache searche 7zip 安装: #安装 sudo apt-get install 7zip 更新: #查看特定软件的版本,前提是要安装ap ...
- mysql中间件amoeba实现mysql读写分离
Amoeba是一个以MySQL为底层数据存储,并相应用提供MySQL协议接口的proxy.它集中地响应应用的请求,根据用户事先设置的规则.将SQL请求发送到特定的数据库上运行.基于此能够实现负载均衡. ...
- Caffe——清晰高效的深度学习(Deep Learning)框架
Caffe(http://caffe.berkeleyvision.org/)是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清(http://daggerfs.com/ ...
- ffplay.c函数结构简单分析(绘图)
近期重温了一下FFplay的源码. FFplay是FFmpeg项目提供的播放器演示样例.虽然FFplay不过一个简单的播放器演示样例,它的源码的量也是不少的. 之前看代码,主要是集中于某一个" ...
- 【CODEFORCES】 D. CGCDSSQ
D. CGCDSSQ time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...