真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C#非托管內(nèi)存的應(yīng)用(二)——結(jié)構(gòu)體拷貝-創(chuàng)新互聯(lián)

  結(jié)構(gòu)體的轉(zhuǎn)換其實(shí)和基礎(chǔ)類型數(shù)組轉(zhuǎn)換差不多,只是結(jié)構(gòu)體不能通過(guò)Marshal.Copy的方式直接轉(zhuǎn)換到內(nèi)存。 結(jié)構(gòu)體痛byte數(shù)組的互轉(zhuǎn)直接用于網(wǎng)絡(luò)通信中還是非常方便的。

睢縣網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,睢縣網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為睢縣上1000家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請(qǐng)找那個(gè)售后服務(wù)好的睢縣做網(wǎng)站的公司定做!

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

/// 
   /// 測(cè)試結(jié)構(gòu)體的Copy
   /// 
   public struct TestStruct
   {
       public string Number;
       public int[] IntMember;
       public byte ByteMember;
       public short ShortMember;
       public override  string ToString()
       {
           return string.Format("Number:" + Number + " ByteMember:" + ByteMember + " ShortMember:" + ShortMember + " IntMemberCount:" + IntMember.Length);
       }
   }

2、Copy結(jié)構(gòu)體成byte數(shù)組的方法

/// 
       /// 將結(jié)構(gòu)體直接Copy成byte數(shù)組
       /// 
       /// 必須是結(jié)構(gòu)體
       /// 返回的byte數(shù)組填充,長(zhǎng)度必須大于Marshal.SizeOf(structObj)
       public static void CopyMemFromStruct(object structObj, byte[] targetData)
       {
           IntPtr tmptr = IntPtr.Zero;
           try
           {
               int size = Marshal.SizeOf(structObj); // 獲取結(jié)構(gòu)體在內(nèi)存中的大小
               tmptr = Marshal.AllocHGlobal(size); // 為緩沖區(qū)分配內(nèi)存空間
               Marshal.StructureToPtr(structObj, tmptr, false); //Copy到分配的非托管內(nèi)存中
               Marshal.Copy(tmptr, targetData, 0, size);
               Marshal.FreeHGlobal(tmptr);
           }
           catch(Exception ex)
           {
               if (tmptr != IntPtr.Zero)
                   Marshal.FreeHGlobal(tmptr);
               throw new Exception("內(nèi)存操作失?。? + ex.ToString());
           }
       }

3、byte數(shù)組Copy成結(jié)構(gòu)體的方法

/// 
       /// 從byte數(shù)組轉(zhuǎn)換成指定的結(jié)構(gòu)體
       /// 
       /// 
       /// 
       /// 
       /// 
       /// 
       public static void CopyMemFromBytes(byte [] sourceData, int startIndex, int length, ref object objectRef, Type type)
       {
           IntPtr tmptr = IntPtr.Zero;
           try
           {
               tmptr = Marshal.AllocHGlobal(length);
               Marshal.Copy(sourceData, startIndex, tmptr, length);
               objectRef = Marshal.PtrToStructure(tmptr, type);
               Marshal.FreeHGlobal(tmptr);
           }
           catch (Exception ex)
           {
               if (tmptr != IntPtr.Zero)
                   Marshal.FreeHGlobal(tmptr);
               throw new Exception("內(nèi)存操作失敗:" + ex.ToString());
           }
       }

4、測(cè)試程序

TestStruct struct1 = new TestStruct();
           struct1.ByteMember = 123;
           struct1.IntMember = new int[] { 1, 3, 45, 4 };
           struct1.Number = "test";
           struct1.ShortMember = 23241;
           Console.WriteLine(struct1.ToString());
           int size = Marshal.SizeOf(struct1);
           byte[] testDest = new byte[size];
           MemoryCopy.CopyMemFromStruct(struct1, testDest);
           object struct2 = new TestStruct();
           MemoryCopy.CopyMemFromBytes(testDest, 0, size,ref struct2, typeof(TestStruct));
           Console.WriteLine(struct2.ToString());

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開(kāi)啟,新人活動(dòng)云服務(wù)器買多久送多久。


網(wǎng)站欄目:C#非托管內(nèi)存的應(yīng)用(二)——結(jié)構(gòu)體拷貝-創(chuàng)新互聯(lián)
網(wǎng)站URL:http://weahome.cn/article/dssjds.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部