байт [] в байт * в C # - PullRequest
       31

байт [] в байт * в C #

6 голосов
/ 16 июня 2011

Я создал 2 программы - на C # и C ++, обе они вызывают нативные методы из C dll. C ++ работает нормально, потому что есть те же типы данных, C # не работает.

А собственный параметр функции равен unsigned char*. Я попытался byte[] в C #, это не сработало, затем я попытался:

fixed(byte* ptr = byte_array) {
  native_function(ptr, (uint)byte_array.Length);
}

Это также не работает. Правильно ли конвертировать байтовый массив в byte* таким образом? Правильно ли использовать байт в C # как unsigned char в C ?

EDIT: Этот материал возвращает неправильный результат:

byte[] byte_array = Encoding.UTF8.GetBytes(source_string);
nativeMethod(byte_array, (uint)byte_array.Length);

Этот материал также возвращает неправильный результат:

 byte* ptr;
 ptr = (byte*)Marshal.AllocHGlobal((int)byte_array.Length);
 Marshal.Copy(byte_array, 0, (IntPtr)ptr, byte_array.Length);

Ответы [ 3 ]

6 голосов
/ 16 июня 2011
unsafe class Test
{
    public byte* PointerData(byte* data, int length)
    {
        byte[] safe = new byte[length];
        for (int i = 0; i < length; i++)
            safe[i] = data[i];

        fixed (byte* converted = safe)
        {
            // This will update the safe and converted arrays.
            for (int i = 0; i < length; i++)
                converted[i]++;

            return converted;
        }
    }
}

Вам также необходимо установить флажок «использовать небезопасный код» в свойствах сборки.

2 голосов
/ 16 июня 2011

Вы должны маршалировать byte[]:

[DllImport("YourNativeDLL.dll")]
public static extern void native_function
(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)]
    byte[] data,
    int count // Recommended
);
0 голосов
/ 16 июня 2011

Вы можете выделить неуправляемый массив и использовать Marshal.Copy для копирования содержимого управляемого массива byte[] в неуправляемый массив unsigned char*. Обратите внимание, что неуправляемые ресурсы необходимо очищать вручную.

...