Какая разница между массивом <Byte>^ и байтом *? - PullRequest
1 голос
/ 10 мая 2011

И можно ли привести массив ^ к байту *?

, как нужно изменить приведенный ниже код для возврата байта *?

array<Byte>^ StrToByteArray(System::String^ unicodeString)
{
    UTF8Encoding^ utf8 = gcnew UTF8Encoding;
    array<Byte>^ encodedBytes = utf8->GetBytes( unicodeString );
    return encodedBytes;
}

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

массив ^ - дескриптор объекта в управляемой куче, байт * - указатель на неуправляемый байт. Вы не можете приводить между ними, но есть возможность исправить управляемый массив и получить указатель на элементы в нем.

РЕДАКТИРОВАТЬ в ответ на первый комментарий:

Вот пример кода, взятый с этой страницы на MSDN

Больше всего вас интересует метод void Load (). Здесь они закрепляют массив и получают указатель на первый элемент в нем ...

// pin_ptr_1.cpp
// compile with: /clr 
using namespace System;
#define SIZE 10

#pragma unmanaged
// native function that initializes an array
void native_function(byte* p) {
    for(byte i = 0 ; i < 10 ; i++)
        p[i] = i;
}
#pragma managed

public ref class A {
private:
    array<byte>^ arr;   // CLR integer array

public:
    A() {
        arr = gcnew array<byte>(SIZE);
    }

    void load() {
        pin_ptr<byte> p = &arr[0];   // pin pointer to first element in arr
        byte* np = p;   // pointer to the first element in arr
        native_function(np);   // pass pointer to native function
    }

    int sum() {
        int total = 0;
        for (int i = 0 ; i < SIZE ; i++)
            total += arr[i];
        return total;
    }
};

int main() {
    A^ a = gcnew A;
    a->load();   // initialize managed array using the native function
    Console::WriteLine(a->sum());
}
0 голосов
/ 10 мая 2011

Нет, вы не можете привести его, но у массива есть метод, который возвращает необработанный массив с именем "data ()"

РЕДАКТИРОВАТЬ: nvm, думал, что вы говорите о массиве классов stl.

...