字节流和结构体的转换[转]

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Management;

namespace Util
{
    
public class NetStreamUtil
    {
        
private static byte _fillChar = 0//the fill character
        
        
//convert string to byte array in Ascii with length is len        
        public static byte[] StringToBytes(string str, int len)
        {
            
if (string.IsNullOrEmpty(str))
            {
                str 
= string.Empty;
            }
 
            
byte[] result = new byte[len];
            
byte[] strBytes = Encoding.Default.GetBytes(str);

            
//copy the array converted into result, and fill the remaining bytes with 0
            for (int i = 0; i < len; i++)
                result[i] 
= ((i < strBytes.Length) ? strBytes[i] : _fillChar);
            
            
return result;
        }

        
/// <summary>
        
/// struct转换为byte[]
        
/// </summary>
        
/// <param name="structObj">结构体对象</param>
        
/// <returns>字节数组</returns>
        public static byte[] StructToBytes(object structObj)
        {
            
int size = Marshal.SizeOf(structObj);
            IntPtr buffer 
= Marshal.AllocHGlobal(size);
            
try
            {
                Marshal.StructureToPtr(structObj, buffer, 
false);
                
byte[] bytes = new byte[size];
                Marshal.Copy(buffer, bytes, 
0, size);
                
return bytes;
            }
            
finally
            {
                Marshal.FreeHGlobal(buffer);
            }
        }

       
/// <summary>
       
///  byte[]转换为struct
       
/// </summary>
       
/// <param name="bytes"></param>
       
/// <param name="strcutType"></param>
       
/// <returns></returns>
       public static object BytesToStruct(byte[] bytes, Type strcutType)   
       {   
             
int size = Marshal.SizeOf(strcutType);   
             IntPtr buffer 
= Marshal.AllocHGlobal(size);   
             
try   
             {   
                Marshal.Copy(bytes, 
0, buffer, size);   
                
return Marshal.PtrToStructure(buffer, strcutType);   
             }   
             
finally   
             {   
                Marshal.FreeHGlobal(buffer);   
             }   
        } 

        
/// <summary>
        
/// IntPtr转换成byte[]
        
/// </summary>
        
/// <param name="dataBuf"></param>
        
/// <param name="length"></param>
        
/// <returns></returns>
        public byte[] ConvertToBytes(IntPtr dataBuf, int length)
        {
            
byte[] byteBuf = new byte[length];
            Marshal.Copy(dataBuf, byteBuf, 
0, length);
            
return byteBuf;
        }

        
/// <summary>
        
/// 获得网卡号
        
/// </summary>
        
/// <returns></returns>
        public static string GetNetCardMacAddress()
        {
            ManagementClass mc 
= new ManagementClass("Win32_NetworkAdapterConfiguration");
            ManagementObjectCollection moc 
= mc.GetInstances();
            
string str = "";
            
foreach (ManagementObject mo in moc)
            {
                
if ((bool)mo["IPEnabled"== true)
                    str 
= mo["MacAddress"].ToString();
            }
            
return str;
        }
    }
}
原文地址:https://www.cnblogs.com/myparamita/p/1568898.html