Как передать int [] из c # в c ++, используя общую память - PullRequest
3 голосов
/ 25 января 2012

Я пытаюсь передать массив целых чисел из c # в 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);

Как бы я изменил это, чтобы вместо этого обрабатывать массив целых чисел? Спасибо!

1 Ответ

1 голос
/ 25 января 2012

а) Вы можете скопировать int [] в байт []. Вы можете использовать BitConverter.GetBytes для этой или битовой арифметики (byte0 = (byte) (i >> 24); byte1 = (byte) (i >> 16); ...)

b) Вы можете использовать небезопасный код для побитового копирования (блика) целого [] в целевой байт []

в) Может быть, вы можете использовать Array.Copy. Я думаю , что он может обрабатывать любые типы значений blittable.

Согласно комментариям я подробно остановлюсь на б):

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];
 }
}
...