Совместное использование массива памяти файла C ++ для C # - PullRequest
0 голосов
/ 17 ноября 2018

я пытаюсь поделиться массивом через файл памяти c ++ to c # на основе этого примера: потоковая передача данных из c ++ в c # через общую память .работает нормально, но я просто могу добраться до позиции 3 из массива, до другой позиции 0. 0. 1003 *

C ++, который создает MemoryFile

#include <windows.h>
#include <stdio.h>

struct Pair {
    int length;
    int data[10];
};

struct Pair* p;
HANDLE handle;

int dataSend[10]{ 500,33,44,66,2,55,98,7,52,36 };

bool startShare()
{
    try
    {
        handle = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(Pair), L"DataSend");
        p = (struct Pair*) MapViewOfFile(handle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, sizeof(Pair));
        return true;
    }
    catch (...)
    {
        return false;
    }

}


int main()
{

    if (startShare() == true)
    {
        printf("Memory Create");
        while (true)
        {
            if (p != 0) {


                for (int h = 0; h < 10; h++)
                {
                     p->data[h] = dataSend[h];
                     printf("\n number %d", dataSend[h]);
                }

            }


            else
                puts("create shared memory error");
        }
    }
    if (handle != NULL)
        CloseHandle(handle);
    return 0;
}

my C # Read

public static int[] data = new int[10];
public static MemoryMappedFile mmf;
public static MemoryMappedViewStream mmfvs;

static public bool MemOpen()
{
    try
    {
        mmf = MemoryMappedFile.OpenExisting("DataSend");
        mmfvs = mmf.CreateViewStream();
        return true;
    }
    catch
    {
        return false;
    }

}

public static void Main(string[] args)
{
    while (true)
    {
        if (MemOpen())
        {

            byte[] blen = new byte[4];
            mmfvs.Read(blen, 0, 4);

            byte[] bPosition = new byte[280];
            mmfvs.Read(bPosition, 0, 280);
            Buffer.BlockCopy(bPosition, 0, data, 0, bPosition.Length);

            for (int i = 0; i < data.Length; i++)
            {
                Console.WriteLine(data[i]);
            }

        }
    }

}

работает нормально, но я просто могу добраться до позиции 3 из массива, другая позиция до 0.

Обновление, код работает нормально Просто подробно, я возвращаю пример шестнадцатеричного значения массива: 52A7E600но в моем коде C # получить битовые числа, такие как: 10300071984, как я не могу преобразовать в сторону C #, чтобы получить тот же формат?

1 Ответ

0 голосов
/ 17 ноября 2018

для преобразования длинного значения в гекс в c # вы можете использовать:

        long intValue = 10300071984;
        // Convert long value 10300071984 -> 265EEA030 as a hex in a string variable
        string hexValue = intValue.ToString("X"); 
...