2008-09-03 10 views
1
class Foo 
{ 
    static bool Bar(Stream^ stream); 
}; 

class FooWrapper 
{ 
    bool Bar(LPCWSTR szUnicodeString) 
    { 
     return Foo::Bar(??); 
    } 
}; 

MemoryStream prendra un byte[] mais je comme de le faire sans copier les données si possible.Comment convertir un IntPtr en flux?

Répondre

6

Vous pouvez éviter la copie si vous utilisez un UnmanagedMemoryStream() à la place (classe existe dans .NET 2.0 et versions ultérieures FCL). Comme MemoryStream, c'est une sous-classe de IO.Stream, et a toutes les opérations de flux habituelles.

Description de Microsoft de la classe est:

Permet d'accéder aux blocs non gérés de mémoire à partir du code managé.

qui vous dit à peu près tout ce que vous devez savoir. Notez que UnmanagedMemoryStream() n'est pas compatible CLS.

+0

Remarque: cette réponse ne fonctionne que dans un code dangereux. Si vous ne compilez pas avec l'indicateur non sécurisé, vous aurez peut-être plus de chance en rassemblant les données dans un tableau d'octets, puis en enveloppant ce tableau d'octets dans un flux. Voir ici: http://stackoverflow.com/a/11660831/684852 Cependant, vous devez connaître la longueur des données (nombre d'octets dans la chaîne unicode d'origine de votre pointeur). Par exemple: 'byte [] dataArray = nouvel octet [dataLength]; Marshal.Copy (szUnicodeString, dataArray, 0, dataLength); Flux MemoryStream = nouveau MemoryStream (dataArray); –

1

Si je devais copier la mémoire, je pense que ce qui suit fonctionnerait:


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); 
}
Questions connexes