C#中结构体和字节数组转换实现

 更新时间:2015年06月05日 10:17:29   投稿:junjie  
这篇文章主要介绍了C#中结构体和字节数组转换实现,本文直接给出了字节数组与结构体的转换代码,代码中包含详细注释,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

最近在使用结构体与字节数组转化来实现socket间数据传输。现在开始整理一下。对于Marshal可以查阅msdn,关于字节数组与结构体转代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Runtime.InteropServices;
namespace FileSendClient
{
 
  [StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
  struct StructDemo
  {
    
    public byte a;
    public byte c;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
    public byte[] b;
    public byte d;
    public int e;
    
  }
  unsafe class Program
  {
    static void Main(string[] args)
    {
      StructDemo sd;
      sd.a = 0;
      sd.d = 0;
      sd.c = 0;
      sd.b = new byte[3] { 0, 0, 1 };
      sd.e = 5;
      int size = 0;
      //此处使用非安全代码来获取到StructDemo的值
      unsafe
      {
        size = Marshal.SizeOf(sd);
      }
       
      byte[] b = StructToBytes(sd,size);
 
      ByteToStruct(b, typeof(StructDemo));
 
    }
 
 
    //将Byte转换为结构体类型
    public static byte[] StructToBytes(object structObj,int size)
    {
      StructDemo sd;
      int num = 2;
      byte[] bytes = new byte[size];
      IntPtr structPtr = Marshal.AllocHGlobal(size);
      //将结构体拷到分配好的内存空间
      Marshal.StructureToPtr(structObj, structPtr, false);
      //从内存空间拷贝到byte 数组
      Marshal.Copy(structPtr, bytes, 0, size);
      //释放内存空间
      Marshal.FreeHGlobal(structPtr);
      return bytes;
 
    }
 
    //将Byte转换为结构体类型
    public static object ByteToStruct(byte[] bytes, Type type)
    {
      int size = Marshal.SizeOf(type);
      if (size > bytes.Length)
      {
        return null;
      }
      //分配结构体内存空间
      IntPtr structPtr = Marshal.AllocHGlobal(size);
      //将byte数组拷贝到分配好的内存空间
      Marshal.Copy(bytes, 0, structPtr, size);
      //将内存空间转换为目标结构体
      object obj = Marshal.PtrToStructure(structPtr, type);
      //释放内存空间
      Marshal.FreeHGlobal(structPtr);
      return obj;
    }
  }
}

相关文章

  • c#使用ManagedWifi查看当前Wifi信号并选择wifi的示例

    c#使用ManagedWifi查看当前Wifi信号并选择wifi的示例

    这篇文章主要介绍了c#使用ManagedWifi查看当前Wifi信号并选择wifi的示例,需要的朋友可以参考下
    2014-04-04
  • C#实现子类与父类的相互转换

    C#实现子类与父类的相互转换

    这篇文章主要介绍了C#实现子类与父类的相互转换,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • C#使用JsonConvert全面解析JSON

    C#使用JsonConvert全面解析JSON

    这篇文章主要介绍了C#使用JsonConvert全面解析JSON,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • C# 表达式目录树的应用详解

    C# 表达式目录树的应用详解

    下面小编就为大家分享一篇C# 表达式目录树的应用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#验证给定字符串形式日期是否合法的方法

    C#验证给定字符串形式日期是否合法的方法

    这篇文章主要介绍了C#验证给定字符串形式日期是否合法的方法,实例分析了C#针对字符串及日期的操作技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 通过C#程序操作Config文件

    通过C#程序操作Config文件

    这篇文章介绍了通过C#程序操作Config文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#中的程序集和反射介绍

    C#中的程序集和反射介绍

    这篇文章主要介绍了C#中的程序集和反射介绍,程序集包含资源文件,类型元数据、IL代码,每个程序集都有自己的名称、版本等信息,反射就是动态获取程序集中的元数据的功能,需要的朋友可以参考下
    2015-01-01
  • C#将Word或Excel文档转换为Html文件

    C#将Word或Excel文档转换为Html文件

    这篇文章介绍了C#将Word或Excel文档转换为Html文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#加密算法汇总(推荐)

    C#加密算法汇总(推荐)

    以下是对C#中的加密算法进行了汇总介绍,需要的朋友可以过来参考下
    2013-09-09
  • C#利用iTextSharp组件给PDF文档添加图片/文字水印

    C#利用iTextSharp组件给PDF文档添加图片/文字水印

    这篇文章主要给大家介绍了关于如何C#利用iTextSharp组件给PDF文档添加图片/文字水印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10

最新评论

?


http://www.vxiaotou.com