Преобразовать / Порт PDWORD код в C # - PullRequest
0 голосов
/ 14 апреля 2011

Я конвертирую некоторый код из C ++ в C #, и мне нужно немного понять, как работать со строками, подобными этим:

PDWORD rgb32_data = (PDWORD) malloc(640*480*4);

Насколько я понимаю, тип PDWORD представляет целое число без знака (32 бита). Какова будет хорошая стратегия C # для реализации подобной структуры?

РЕДАКТИРОВАТЬ: я понял, что мне нужно использовать IntPtr для замены PDWORD, но IntPtr будет содержать одно значение в отличие от многих значений, как в массиве. Любые предложения C #?

EDIT2: Uint [] не работают для меня - к сожалению, единственный способ, которым я могу заставить программу компилироваться со всеми ее зависимостями, это когда я ввожу в качестве аргумента IntPtr, а не IntPtr [].

Спасибо.

РЕДАКТИРОВАТЬ - я отметил решение, кроме того, мне нужно было сделать следующее:

Так как мне нужно было использовать IntPtr, я добавил этот код

        IntPtr rgb32_ptr; 
        GCHandle handle = GCHandle.Alloc(rgb32_data, GCHandleType.Pinned);
        try
        {
            rgb32_ptr = handle.AddrOfPinnedObject();
        }
        finally
        {
            if (handle.IsAllocated)
            {
                handle.Free();
            }
        }

чтобы получить IntPtr к тому же.

Ответы [ 4 ]

5 голосов
/ 14 апреля 2011

Согласно MSDN , PDWORD определяется как:

typedef DWORD*  PDWORD;

Таким образом, это указатель на DWORD, который MSDN также говорит, что - это 32-разрядное целое число без знака - другими словами, uint.

Обратите внимание, что ваша строка кода C ++ выделяет память для массива 640 * 480 = 307 200 DWORD с.

Вы можете перевести это прямо как:

uint[] rgb32_data = new uint[640 * 480];

Но код, возможно, действительно захочет использовать его как просто серию байтов в памяти, поэтому вы можете вместо этого использовать массив байтов

byte[] rgb32_data = new byte[640 * 480 * 4];

и используйте методы в классе BitConverter (особенно метод ToInt32()), если вы считаете, что это ближе к тому, как исходная программа обрабатывает данные.

2 голосов
/ 14 апреля 2011

Вы можете использовать небезопасные указатели и Marshal.AllocHGlobal()

    Program()
    {            
        unsafe
        {
            IntPtr ptr = Marshal.AllocHGlobal(640 * 480 * 4);

            uint* ptr2 = (uint*)ptr.ToPointer();

            for (int i = 0; i < 640*480; i++)
            {
                ptr2[i] = 0;
            }

            Marshal.FreeHGlobal(ptr);
        }
    }
1 голос
/ 14 апреля 2011

PDWORD - указатель на 32-разрядное целое число без знака. В C # это будет ref uint32. Или IntPtr, если вы используете 32-разрядную среду выполнения.

Это зависит от того, как вы собираетесь его использовать. Если вы передаете его неуправляемому коду, я бы предложил ref UInt32. Если вы используете его для выделения памяти (например, возвращаемое значение из функции Windows API, которая выделяет память), вы можете использовать IntPtr.

0 голосов
/ 14 апреля 2011

PDWORD - указатель на DWORD. Есть несколько вариантов преобразования кода в C # в зависимости от того, как он будет использоваться.

Для самого DWORD вы можете использовать System.UInt32 в качестве эквивалента. Marshal.AllocHGlobal может быть заменой, но нам нужно посмотреть, как она будет использоваться. Вы сами обращаетесь к памяти или, возможно, передаете ее другой неуправляемой функции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...