久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C#通過TCP傳送結(jié)構(gòu)體

 杯開水 2012-01-29

在寫C#TCP通信程序時,發(fā)送數(shù)據(jù)時,,只能發(fā)送byte數(shù)組,,處理起來比較麻煩不說,如果是和VC6.0等寫的程序通信的話,,很多的都是傳送結(jié)構(gòu)體,,在VC6.0中可以很方便的把一個char[]數(shù)組轉(zhuǎn)換為一個結(jié)構(gòu)體,,而在C#卻不能直接把byte數(shù)組轉(zhuǎn)換為結(jié)構(gòu)體,,要在C#中發(fā)送結(jié)構(gòu)體,,可以按以下方法實現(xiàn):

1)定義結(jié)構(gòu)體:

//命名空間
using System.Runtime.InteropServices;

    
//注意這個屬性不能少
     [StructLayoutAttribute(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]
    
struct TestStruct
    
{
        
public int c;
        
//字符串,SizeConst為字符串的最大長度
         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        
public string str;
        
//int數(shù)組,,SizeConst表示數(shù)組的個數(shù),,在轉(zhuǎn)換成
        
//byte數(shù)組前必須先初始化數(shù)組,再使用,,初始化
        
//的數(shù)組長度必須和SizeConst一致,,例test = new int[6];
         [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
        
public int[] test;
     }

 

2)結(jié)構(gòu)體轉(zhuǎn)byte數(shù)組:

        /// <summary>
        
/// 結(jié)構(gòu)體轉(zhuǎn)byte數(shù)組
        
/// </summary>
        
/// <param name="structObj">要轉(zhuǎn)換的結(jié)構(gòu)體</param>
        
/// <returns>轉(zhuǎn)換后的byte數(shù)組</returns>

        public static byte[] StructToBytes(object structObj)
        
{
            
//得到結(jié)構(gòu)體的大小
            int size = Marshal.SizeOf(structObj);
            
//創(chuàng)建byte數(shù)組
            byte[] bytes = new byte[size];
            
//分配結(jié)構(gòu)體大小的內(nèi)存空間
             IntPtr structPtr = Marshal.AllocHGlobal(size);
            
//將結(jié)構(gòu)體拷到分配好的內(nèi)存空間
             Marshal.StructureToPtr(structObj, structPtr, false);
            
//從內(nèi)存空間拷到byte數(shù)組
             Marshal.Copy(structPtr, bytes, 0, size);
            
//釋放內(nèi)存空間
             Marshal.FreeHGlobal(structPtr);
            
//返回byte數(shù)組
            return bytes;
         }

 

3)byte數(shù)組轉(zhuǎn)結(jié)構(gòu)體:

        /// <summary>
        
/// byte數(shù)組轉(zhuǎn)結(jié)構(gòu)體
        
/// </summary>
        
/// <param name="bytes">byte數(shù)組</param>
        
/// <param name="type">結(jié)構(gòu)體類型</param>
        
/// <returns>轉(zhuǎn)換后的結(jié)構(gòu)體</returns>

        public static object BytesToStuct(byte[] bytes,Type type)
        
{
            
//得到結(jié)構(gòu)體的大小
            int size = Marshal.SizeOf(type);
            
//byte數(shù)組長度小于結(jié)構(gòu)體的大小
            if (size > bytes.Length)
            
...{
                
//返回空
                return null;
             }

            
//分配結(jié)構(gòu)體大小的內(nèi)存空間
             IntPtr structPtr = Marshal.AllocHGlobal(size);
            
//將byte數(shù)組拷到分配好的內(nèi)存空間
             Marshal.Copy(bytes,0,structPtr,size);
            
//將內(nèi)存空間轉(zhuǎn)換為目標(biāo)結(jié)構(gòu)體
            object obj = Marshal.PtrToStructure(structPtr, type);
            
//釋放內(nèi)存空間
             Marshal.FreeHGlobal(structPtr);
            
//返回結(jié)構(gòu)體
            return obj;
         }

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多