這標題或許有些大,叫做“CSharp非托管內(nèi)存拷貝轉(zhuǎn)換數(shù)據(jù)”之類的也許更貼近本文主題。考慮到本文有擴展的可能,就先這樣子吧!本篇的內(nèi)容主要包括:
讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:申請域名、雅安服務器托管、營銷軟件、網(wǎng)站建設、西固網(wǎng)站維護、網(wǎng)站推廣。1、簡介
2、利用非托管內(nèi)存轉(zhuǎn)換基本類型數(shù)組
1、簡介
C#專門提供了非托管內(nèi)存操作的功能類System.Runtime.InteropServices.Marshal。做過C/C++互操作的朋友應該對這個類有所了解吧!
非托管內(nèi)存使用的好處是方便,能夠快速操作內(nèi)存,在一些類型數(shù)據(jù)轉(zhuǎn)換的時候能夠減少運算量,提升運算速度;缺點就是會花費更多的內(nèi)存,而且操作非托管內(nèi)存很容易引起內(nèi)存泄漏,所以使用的時候需要萬分小心,在給程序員帶來方便的同時,也會挖下一些隱藏的坑!
2、利用非托管內(nèi)存轉(zhuǎn)換基本類型數(shù)組
/// <summary> /// short數(shù)組轉(zhuǎn)換成byte數(shù)組 /// </summary> /// <param name="source"></param> /// <param name="target"></param> /// <param name="sourceLen">要Copy的source數(shù)組個數(shù)</param> public static void CopyMemFromShort(short[] source, byte[] target, int sourceLen) { IntPtr tmpPtr = IntPtr.Zero; try { tmpPtr = Marshal.AllocHGlobal(sourceLen * 2); // 申請內(nèi)存 //copy數(shù)據(jù)到指定非托管內(nèi)存地址 Marshal.Copy(source, 0, tmpPtr, sourceLen); //copy非托管內(nèi)存數(shù)據(jù)到指定byte數(shù)組 Marshal.Copy(tmpPtr, target, 0, sourceLen * 2); Marshal.FreeHGlobal(tmpPtr); // 清空申請的非托管內(nèi)存 } catch (Exception ex) { if (tmpPtr != IntPtr.Zero) Marshal.FreeHGlobal(tmpPtr); throw new Exception("內(nèi)存操作失敗:" + ex.ToString()); } }
當然,大家完全可以用System.Buffer.BlockCopy()方法來實現(xiàn)以上的操作,本方法可以完全當做另一種思路,而且由于會申請額外的空間,在大量數(shù)據(jù)的copy時候,效率上也不及BlockCopy。
一般來講,操作非托管內(nèi)存的使用步驟包括
a.申請內(nèi)存;b.拷貝數(shù)據(jù)到非托管內(nèi)存;c.拷貝非托管內(nèi)存數(shù)據(jù)到托管內(nèi)存; d.釋放內(nèi)存。
申請內(nèi)存
System.IntPtr tmpPtr = Marshal.AllocHGlobal(sourceLen); // 申請內(nèi)存
上面的代碼就從非托管內(nèi)存中申請了sourceLen長度的內(nèi)存(字節(jié)為單位),返回的結(jié)構(gòu)體為申請內(nèi)存地址的指針,申請內(nèi)存可能出現(xiàn)OutofMemory的異常,使用的時候要注意。
拷貝數(shù)據(jù)到非托管內(nèi)存、拷貝非托管內(nèi)存數(shù)據(jù)到托管內(nèi)存
//copy數(shù)據(jù)到指定非托管內(nèi)存地址 Marshal.Copy(source, 0, tmpPtr, sourceLen); //copy非托管內(nèi)存數(shù)據(jù)到指定byte數(shù)組,short->byte 2個字節(jié)->1個字節(jié),所以長度要* 2 Marshal.Copy(tmpPtr, target, 0, sourceLen * 2);
以上兩個步驟都是用的同一個方法的不同重裝。Marshal.Copy既支持從非托管內(nèi)存Copy數(shù)據(jù),也支持將數(shù)據(jù)Copy到非托管內(nèi)存,詳細介紹可見MSDN文檔
釋放內(nèi)存
Marshal.FreeHGlobal(tmpPtr); // 清空申請的非托管內(nèi)存
最后釋放內(nèi)存,這一步很重要,用了的非托管內(nèi)存必須手動釋放!
上面的方法只演示了從short[]轉(zhuǎn)換到byte[]的轉(zhuǎn)換,其它轉(zhuǎn)換如byte[]->short[]。int[]->byte[]。int[]->short[]都類似,編碼的時候需要將它們在內(nèi)存中占用的字節(jié)數(shù)搞清楚,避免內(nèi)存溢出等問題的出現(xiàn)。
詳細的轉(zhuǎn)換代碼我會在最后一篇給出,下一篇會說到結(jié)構(gòu)體在內(nèi)存中的轉(zhuǎn)換方法。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
標題名稱:C#非托管內(nèi)存的應用(一)——基本數(shù)據(jù)的拷貝-創(chuàng)新互聯(lián)
瀏覽地址:http://vcdvsql.cn/article42/csshec.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供建站公司、網(wǎng)站制作、網(wǎng)站改版、企業(yè)網(wǎng)站制作、品牌網(wǎng)站制作、電子商務
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容