C# 结构体转换byte
来源:互联网 发布:男士祛痘洗面奶 知乎 编辑:程序博客网 时间:2024/05/16 05:44
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices; //需要添加命名空间
namespace YuanLiChenXiao
{
/// <summary>
/// 消息头结构体
/// </summary>
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=1)]
public struct StructMessage
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 30)]
public byte[] fileName; //文件名30个byte
public long fileLength; //文件长度8byte
}
public class ConverData
{
/// <summary>
/// 将结构体转换成byte
/// </summary>
/// <param name="obj">结构体</param>
/// <returns>byte数组</returns>
public static byte[] StructToByte(object obj)
{
if (null == obj)
{
return null;
}
//长度
int len = Marshal.SizeOf(obj);
byte[]buffer = new byte[len];
//从进程非托管内存中分配内存
IntPtr ptr = Marshal.AllocHGlobal(len);
//将数据从托管的对象封送到非托管内存
Marshal.StructureToPtr(obj, ptr, true);
//将数据从非托管的内存指针复制到托管
Marshal.Copy(ptr, buffer, 0, len);
//释放分配的内存
Marshal.FreeHGlobal(ptr);
return buffer;
}
/// <summary>
/// 将byte[]还原成结构体
/// </summary>
/// <param name="buffer">byte[]</param>
/// <param name="type"></param>
/// <returns></returns>
public static object ByteToStruct(byte[] buffer, Type type)
{
int len = Marshal.SizeOf(type);
if (len != buffer.Length)
{
return null;
}
IntPtr ptr = Marshal.AllocHGlobal(len);
//将托管数据复制到非托管内存
Marshal.Copy(buffer, 0, ptr, len);
object obj = Marshal.PtrToStructure(ptr, type);
//释放内存
Marshal.FreeHGlobal(ptr);
return obj;
}
/// <summary>
/// 调用
/// </summary>
public void UseExample()
{
//赋值
StructMessage header = new StructMessage();
header.fileLength = 9527;
string fileName = "YuanLiChenXiao.exe";
header.fileName = new byte[30];
byte[] tmp = Encoding.UTF8.GetBytes(fileName);
header.fileName = Array.Copy(tmp,header.fileName,30);
//转换为定长38字节
byte[] buffer = ConverData.StructToByte(header);
//还原结构体
StructMessage msg = (StructMessage)ConverData.ByteToStruct(buffer, typeof(StructMessage));
}
}
}
- C# 结构体转换byte
- C#中byte数组与结构体之间的转换
- 关于C#结构体和byte[]之间的转换
- c#结构体和byte[]之间的转换
- C# 转换uint,byte[],char[],string, short[]<->byte[] 结构体和字节数组转化
- int/byte/byte[]转换 c#
- c# 结构体struct包含数与byte类型的转换(一)
- c# 结构体struct包含数与byte类型的转换(二)
- C#学习之byte数组与结构体之间的转换
- byte数组和结构体相互转换
- c# int byte转换
- C# struct byte[] 转换
- C# string byte[] 转换
- c# byte[] string 转换
- 结构体与byte数组转换/结构体内定长数组
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
- (一)一个工作任务引起的乱战——c#中结构体与byte[]间相互转换
- c# string与byte[]转换
- Qt 智能指针学习
- hdu 2062
- 浅谈Java类库解耦基本设计思路
- MySQL里求给定的时间是所在月份的第几个礼拜
- 扩展欧几里得算法---Extended Euclidean algorithm
- C# 结构体转换byte
- 真实的哈佛
- Java中获取键盘输入值的三种方法
- Nutch相关框架安装使用最佳指南
- wrod中为什么我在插入一个字后后一个字会被替换为什么插入一个字却变成替换一个字WORD中在一个字前插入一个字时会自动替换掉后面的字怎么让它不替换
- Android开发中SQLite的简单使用方法
- 用flexigrid实现分页显示 一
- <s:action>标签的用法
- Linux操作系统基础(二)