bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

C#非托管內(nèi)存的應用(一)——基本數(shù)據(jù)的拷貝-創(chuàng)新互聯(lián)

這標題或許有些大,叫做“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)

成都定制網(wǎng)站建設