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类型,在托管代码和非托管代码中占据内存大小 和意义都是一个样的. 结构体封送的关键是:在托管代码和非托管代码中定义的一致性.什么是定义的一致性?包括结 ...
随机推荐
- 洛谷 2633 BZOJ 2588 Spoj 10628. Count on a tree
[题解] 蜜汁强制在线... 每个点开一个从它到根的可持久化权值线段树.查询的时候利用差分的思想在树上左右横跳就好了. #include<cstdio> #include<algor ...
- Java基础学习总结(86)——Java异常处理机制Exception抛出异常时throw和throws用法详解
什么时运行时异常?什么是非运行时异常? 通俗的讲: 运行时异常:就是编译通过,运行时就崩了,比如数组越界. 非运行时异常:就是编译不通过,这时就得必须去处理了.不然就没法运行了. 全面的讲: Thro ...
- win7 32位机安装VMware win7 64位虚拟机
VMware10虚拟机怎么安装win7系统(详细教程):https://jingyan.baidu.com/article/86f4a73ec62e8f37d65269a1.html 然而上述教程想不 ...
- Oracle 关于几个随机函数sys_guid、dbms_random.random、dbms_random.value(取随机的结果集)
sys_guid():SYS_GUID (),是Oracle 8i 后提供的函数.SYS_GUID产生并返回一个全球唯一的标识符(原始值)由16个字节组成.更适合多个数据库数据集成时使用(--源自百度 ...
- spring-boot | 整合通用Mabatis 分页插件PageHelper
Mybatis通用Mapper介绍 Mybatis 通用 Mapper 极其方便的使用 Mybatis 单表的增删改查,支持单表操作,不支持通用的多表联合查询 优点: 通用 Mapper 可以极大的方 ...
- 夜话JAVA设计模式之单例模式(单件模式Singleton)
单例模式也叫单件模式,就是确保一个类只有一个实例,并提供一个全局访问点. 设计成单例即把某个类设计成我们自己管理的单独实例,避免实例对象的重复创建,我们只有通过单例类的全局访问点获取实例. 下面来看金 ...
- 分享一个灰常好的 dapper 扩展插件: Rainbow
dapper 是一个效率非常高的orm 框架 ,效率要远远大于 我们大微软的EF . 它只有一个类文件,非常之小.(在 EF 5.0 后 微软已经做了 改进) ps; 由于之前我也没测试过,只 ...
- Problem 2669
Romantic Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- linux系统下安装R
一.先通过ssh将R安装包R-3.2.2.tar.gz从本机复制到你的linux虚拟机上的/home下: 二.解压安装包 #tar -zxvf R-3.2.2.tar.gz 三.1).进入到解压后的R ...
- 【转】keyCode对照表及JS监听组合按键
原文: http://blog.csdn.net/qq_21386275/article/details/67640576 有一些需求,html 页面上的input 框只允许输入数字, 只允许输入小 ...