2008-09-03 3 views

ответ

6

Вы можете избежать копии, если вы используете UnmanagedMemoryStream() вместо (класс в .NET FCL 2.0 и более поздних версий существует). Подобно MemoryStream, он является подклассом IO.Stream и имеет все обычные потоковые операции.

описание компании Microsoft в классе:

Предоставляет доступ к неуправляемым блокам памяти из управляемого кода.

, который в значительной степени говорит вам, что вам нужно знать. Обратите внимание, что UnmanagedMemoryStream() не соответствует CLS.

+0

Примечание: этот ответ работает только в небезопасном коде. Если вы не компилируете флаг небезопасности, вам может быть повезло, если вы разделите данные на массив байтов, а затем завершите этот массив байтов в потоке. См. Здесь: http://stackoverflow.com/a/11660831/684852 Однако вам нужно знать длину данных (количество байтов в исходной строке Unicode у вашего указателя). Например: `byte [] dataArray = новый байт [dataLength]; Marshal.Copy (szUnicodeString, dataArray, 0, dataLength); MemoryStream stream = новый MemoryStream (dataArray); ` – 2013-12-22 21:57:57

1

Если бы мне пришлось скопировать память, я думаю, что следующий будет работать:


static Stream^ UnicodeStringToStream(LPCWSTR szUnicodeString) 
{ 
    //validate the input parameter 
    if (szUnicodeString == NULL) 
    { 
     return nullptr; 
    } 

    //get the length of the string 
    size_t lengthInWChars = wcslen(szUnicodeString); 
    size_t lengthInBytes = lengthInWChars * sizeof(wchar_t); 

    //allocate the .Net byte array 
    array^ byteArray = gcnew array(lengthInBytes); 

    //copy the unmanaged memory into the byte array 
    Marshal::Copy((IntPtr)(void*)szUnicodeString, byteArray, 0, lengthInBytes); 

    //create a memory stream from the byte array 
    return gcnew MemoryStream(byteArray); 
}
Смежные вопросы