2012-01-24 61 views
3

我試圖通過託管內存文件將c#整數數組傳遞給C++。文本很容易工作,但是我在C++環境中處於深度,並且不知道如何針對整數數組進行調整。如何將int []從c#傳遞到使用共享內存的C++

在C#側,我通過:

pView = LS.Core.Platforms.Windows.Win32.MapViewOfFile(
       hMapFile,      // Handle of the map object 
       LS.Core.Platforms.Windows.Win32.FileMapAccess.FILE_MAP_ALL_ACCESS, // Read and write access 
       0,        // High-order DWORD of file offset 
       ViewOffset,      // Low-order DWORD of file offset 
       ViewSize      // Byte# to map to the view 
       ); 

byte[] bMessage2 = Encoding.Unicode.GetBytes(Message2 + '\0'); 
Marshal.Copy(bMessage2, 0, pView2, bMessage2.Length); 

這裏pView2是指針到存儲器映射文件。

在C++方面,我呼籲:

LPCWSTR pBuf; 
pBuf = (LPCWSTR) MapViewOfFile(hMapFile, // handle to map object 
      FILE_MAP_ALL_ACCESS, // read/write permission 
      0, 
      0, 
      BUF_SIZE); 

我將如何改變這個處理整數數組呢?謝謝!

+2

,你能否告訴我們的'pView2'定義的代碼?任何你不使用'MemoryMappedFile'的原因? – user7116

+0

你爲什麼使用內存映射文件? –

+0

@sixletter,我補充說。我使用內存映射文件,因爲在應用程序之間共享信息非常快。 –

回答

1

a)您可以將int []複製到byte []中。您可以使用BitConverter.GetBytes進行這種或者位運算(byte0 =(byte)(i >> 24); byte1 =(byte)(i >> 16); ...)

b)您可以使用不安全代碼複製(blit)int []到目標字節[]

c)也許你可以使用Array.Copy。我認爲它可以處理任何blittable值類型。

按照我會闡述B上的評論):

int[] src = ...; 
IntPtr target = ...; 
var bytesToCopy = ...; 

fixed(int* intPtr = src) { 
var srcPtr = (byte*)intPtr; 
var targetPtr = (byte*)target; 
for(int i from 0 to bytesToCopy) { 
    targetPtr[i] = srcPtr[i]; 
} 
} 
+0

無可否認,我在這裏還是有點迷路。就目前而言,我已經辭去了解析字符串的職責。 –

+0

將字符串複製到字節[] bMessage2中。您也可以將您的int []複製到byte []中,以便您可以將它與內存映射一起使用。 – usr

+0

謝謝,我認爲我看到了將其運用到工作中的途徑,但這是我的子問題。如果有什麼樣的性能增益(如果有的話),我實際上會看到從字符串中讀取〜5k個整數,然後在添加到向量時將它們投射,或者使用一些按位數學算法從字節生成它們,正如您的解決方案所建議的那樣? –