zoukankan      html  css  js  c++  java
  • c# struct 变量 到 byte[] 变量的转换操作

      1 using System.Runtime.InteropServices;
      2 
      3 #region 需要转换的结构 
      4  [StructLayout(LayoutKind.Sequential, Pack=1)]//struTest变量在内存中的对齐方式 (指针类型转换成功的必要条件)
      5  public struct struTest{
      6   public int intId;
      7   public int intName;
      8   public DateTime dtBegintime;
      9  }
     10  #endregion
     11 
     12 /// <summary>
     13  /// xamConverter 的摘要说明。 特定结构变量和byte[]之间的转换操作
     14  /// author:xam
     15  /// date:2007-4-23
     16  /// note:apply convertion functions to deal with convertion between struct value and byte [] value;
     17  /// </summary>
     18  public class xamConverter
     19  {
     20   #region 构造函数
     21   public xamConverter()
     22   {
     23    
     24    //
     25    // TODO: 在此处添加构造函数逻辑
     26    //
     27   }
     28   #endregion
     29 
     30   #region 方式一 通过指针类型的强制转换
     31   
     32   #region 结构变量到byte[]的转换
     33   /// <summary>
     34   /// 结构变量到byte[]的转换
     35   /// </summary>
     36   /// <param name="s">结构变量</param>
     37   /// <returns>byte[](已分配空间)</returns>
     38   public unsafe byte[] xamStructToBytes( struTest s ) {
     39    byte[] arr = new byte[ sizeof(struTest) ];
     40    fixed( byte* parr = arr ) {
     41    *((struTest*)parr) = s; }
     42    return arr;
     43   }
     44   #endregion
     45 
     46   #region byte[] 到结构变量的转换
     47   /// <summary>
     48   /// byte[] 到结构变量的转换
     49   /// </summary>
     50   /// <param name="arr">byte[]</param>
     51   /// <returns>结构变量</returns>
     52   public unsafe struTest xamBytesToStruct( byte[] arr ) {
     53    if( arr.Length < sizeof(struTest) )
     54     throw new ArgumentException();
     55 
     56    struTest s;
     57    fixed( byte* parr = arr ) {
     58    s = *((struTest*)parr); }
     59    return s;
     60   }
     61   #endregion
     62 
     63   #region 结构变量数组到byte[]的转换
     64   /// <summary>
     65   /// 结构变量数组到byte[]的转换
     66   /// </summary>
     67   /// <param name="s">结构变量数组</param>
     68   /// <param name="tSize">结构变量数组的大小</param>
     69   /// <returns>byte[]</returns>
     70   public unsafe byte[] xamStructToBytes( struTest[] s,int tSize ) {
     71    int i;
     72    byte[] arr = new byte[ sizeof(struTest)*tSize ];
     73    for(i=0;i<tSize;i++){
     74     
     75     fixed( byte* parr = arr ) {
     76      
     77      (((struTest*)parr)[i]) = s[i]; 
     78     }
     79    }
     80    return arr;
     81   }
     82   #endregion
     83 
     84   #region byte[] 到结构变量数组的转换
     85   /// <summary>
     86   /// byte[] 到结构变量数组的转换
     87   /// </summary>
     88   /// <param name="arr">byte[]</param>
     89   /// <param name="tSize">byte[]包含的结构变量数组的大小</param>
     90   /// <returns></returns>
     91   public unsafe struTest[] xamBytesToStruct( byte[] arr,int tSize ) {
     92    if( arr.Length < sizeof(struTest)*tSize )
     93     throw new ArgumentException();
     94    int i;
     95    struTest[] s = new struTest[tSize];
     96    
     97    
     98    for(i=0;i<tSize;i++){
     99     
    100     fixed( byte* parr = arr ) {
    101     
    102      s[i] = (((struTest*)parr)[i]); 
    103     }
    104    }
    105    return s;
    106    
    107   }
    108   #endregion
    109 
    110   #endregion
    111 
    112   #region 方式二 
    113   
    114   #region 结构变量到byte[]的转换
    115   /// <summary>
    116   /// 结构变量到byte[]的转换
    117   /// </summary>
    118   /// <param name="s">结构变量</param>
    119   /// <returns>byte[](已分配空间)</returns>
    120   public unsafe byte[] xamStructToBytesB( struTest s ) {
    121    
    122    int size = Marshal.SizeOf(s);
    123    
    124    System.IntPtr ptr = Marshal.AllocHGlobal(size);
    125    
    126    Marshal.StructureToPtr(s, ptr,true);
    127    byte[] ba=new byte[size];
    128    
    129    Marshal.Copy(ptr, ba, 0, ba.Length );
    130 
    131    return ba;
    132   }
    133   #endregion
    134 
    135   #region byte[] 到结构变量的转换
    136   /// <summary>
    137   /// byte[] 到结构变量的转换
    138   /// </summary>
    139   /// <param name="arr">byte[]</param>
    140   /// <returns>结构变量</returns>
    141   public unsafe struTest xamBytesToStructB( byte[] arr ) {
    142    
    143    struTest struReturn=new struTest();
    144    
    145    int size = Marshal.SizeOf(struReturn);
    146    
    147    System.IntPtr ptr = Marshal.AllocHGlobal(size);
    148    Marshal.Copy(arr,0,ptr,arr.Length);
    149 
    150    struReturn = (struTest)Marshal.PtrToStructure(ptr,struReturn.GetType());
    151   
    152 
    153    return struReturn;
    154 
    155   }
    156   #endregion
    157 
    158   #region 结构变量数组到byte[]的转换
    159   /// <summary>
    160   /// 结构变量数组到byte[]的转换
    161   /// </summary>
    162   /// <param name="s">结构变量数组</param>
    163   /// <param name="tSize">结构变量数组的大小</param>
    164   /// <returns>byte[]</returns>
    165   public unsafe byte[] xamStructToBytesB( struTest[] s,int tSize ) {
    166    int i;
    167    int size = Marshal.SizeOf(s[0])*s.Length;
    168    
    169    System.IntPtr [] ptrs = new IntPtr[s.Length];
    170    
    171    for(i=0;i<tSize;i++){
    172     ptrs[i] = Marshal.AllocHGlobal(size);
    173     Marshal.StructureToPtr(s[i], ptrs[i],true);
    174    }
    175   
    176 
    177    
    178    byte[] ba=new byte[size];
    179    
    180    for(i=0;i<tSize;i++){
    181     Marshal.Copy(ptrs[i], ba, i*Marshal.SizeOf(s[0]), Marshal.SizeOf(s[0]) );
    182    }
    183    return ba;
    184   }
    185   #endregion
    186 
    187   #region byte[] 到结构变量数组的转换
    188   /// <summary>
    189   /// byte[] 到结构变量数组的转换
    190   /// </summary>
    191   /// <param name="arr">byte[]</param>
    192   /// <param name="tSize">byte[]包含的结构变量数组的大小</param>
    193   /// <returns></returns>
    194   public unsafe struTest[] xamBytesToStructB( byte[] arr,int tSize ) {
    195    if( arr.Length < sizeof(struTest)*tSize )
    196     throw new ArgumentException();
    197    
    198    
    199    struTest[] struReturn=new struTest[tSize];
    200    int intUnitSize = Marshal.SizeOf(struReturn[0]);
    201    int size = intUnitSize*tSize;
    202    
    203    int i;int intTemp;
    204 
    205    System.IntPtr [] ptrs = new IntPtr[tSize]; 
    206    for(i=0;i<tSize;i++){
    207     intTemp = i*intUnitSize;
    208     ptrs[i] = Marshal.AllocHGlobal(size);
    209     Marshal.Copy(arr,intTemp,ptrs[i],intUnitSize);
    210     struReturn[i] = (struTest)Marshal.PtrToStructure(ptrs[i],struReturn[i].GetType());
    211    }
    212   
    213 
    214    return struReturn;
    215    
    216   }
    217   #endregion
    218 
    219   #endregion
    220 
    221  }
    222 
    223  //使用unsafe code 不安全代码选项需打开
    224 
    225 //演示
    226 
    227 #region 结构数组测试
    228    xamConverter xc = new xamConverter();
    229    struTest[] st = new struTest[3];
    230    st[0].intId = 1;
    231    st[0].intName = 12;
    232    st[0].dtBegintime = DateTime.Now;
    233 
    234    st[2].intId = 2;
    235    st[2].intName = 232;
    236    st[2].dtBegintime = DateTime.Now;
    237    
    238    byte [] inputBytes = xc.xamStructToBytesB(st,3);
    239    struTest[] st2 = xc.xamBytesToStructB(inputBytes,3);
    240    
    241    MessageBox.Show(st2[2].dtBegintime.ToString() + " =  " + st2[2].intName.ToString());
    242    #endregion
  • 相关阅读:
    机器学习之线性回归
    机器学*-K*邻算法模型预测实战
    机器学习-特征抽取
    机器学习sklearn和字典特征抽取
    机器学习第一讲
    spark统计每个省份广告点击量top3
    spark统计单位时间内访问量
    并发容器之 ConcurrentHashMap源码剖析
    并发之 Java中的锁
    并发之 深入剖析volatile底层原理
  • 原文地址:https://www.cnblogs.com/wilderhorse/p/3246277.html
Copyright © 2011-2022 走看看