結(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ù)器買多久送多久。