Obteniendo una variedad de bytes de Windows :: Storage :: Streams :: IBuffer

Tengo un objeto que implementa la interfaz Windows::Storage::Streams::IBuffer , y quiero obtener una matriz de bytes, sin embargo, al mirar la documentación, esta interfaz parece bastante inútil, y la documentación no ofrece cualquier referencia a cualquier otra clase que pueda combinarse con esta interfaz para lograr mi propósito. Todo lo que he encontrado hasta ahora con google es una referencia a la clase .Net WindowsRuntimeBufferExtensions pero estoy usando C ++ así que esto también es un callejón sin salida.

¿Puede alguien dar una pista sobre cómo obtener una matriz de bytes de Windows::Storage::Streams::IBuffer en C ++?

Puede usar IBufferByteAccess, a través de conversiones COM exóticas:

 byte* GetPointerToPixelData(IBuffer^ buffer) { // Cast to Object^, then to its underlying IInspectable interface. Object^ obj = buffer; ComPtr insp(reinterpret_cast(obj)); // Query the IBufferByteAccess interface. ComPtr bufferByteAccess; ThrowIfFailed(insp.As(&bufferByteAccess)); // Retrieve the buffer data. byte* pixels = nullptr; ThrowIfFailed(bufferByteAccess->Buffer(&pixels)); return pixels; } 

Ejemplo de código copiado de http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html

También verifica este método:

IBuffer -> Plataforma :: Matriz
CryptographicBuffer.CopyToByteArray

Plataforma :: Matriz -> IBuffer
CryptographicBuffer.CreateFromByteArray

Como nota al margen, si desea crear Platform::Array partir de una simple matriz C ++ puede usar Platform::ArrayReference , por ejemplo:

 char* c = "sdsd"; Platform::ArrayReference arraywrapper((unsigned char*) c, sizeof(c)); 

Esta es una versión de C ++ / CX:

 std::vector getData( ::Windows::Storage::Streams::IBuffer^ buf ) { auto reader = ::Windows::Storage::Streams::DataReader::FromBuffer(buf); std::vector data(reader->UnconsumedBufferLength); if ( !data.empty() ) reader->ReadBytes( ::Platform::ArrayReference( &data[0], data.size())); return data; } 

Para obtener más información, vea Array y WriteOnlyArray (C ++ / CX) .

Como se mencionó anteriormente, WindowsRuntimeBufferExtensions desde el espacio de nombres System::Runtime::InteropServices::WindowsRuntime solo está disponible para aplicaciones .Net y no para aplicaciones nativas de C ++.

Una posible solución sería usar Windows::Storage::Streams::DataReader :

 void process(Windows::Storage::Streams::IBuffer^ uselessBuffer) { Windows::Storage::Streams::DataReader^ uselessReader = Windows::Storage::Streams::DataReader::FromBuffer(uselessBuffer); Platform::Array^ managedBytes = ref new Platform::Array(uselessBuffer->Length); uselessReader->ReadBytes( managedBytes ); BYTE * bytes = new BYTE[uselessBuffer->Length]; for(int i = 0; i < uselessBuffer->Length; i++) bytes[i] = managedBytes[i]; (...) } 

Esto debería funcionar con las extensiones WinRT:

 // Windows::Storage::Streams::DataReader // buffer is assumed to be of type Windows::Storage::Streams::IBuffer // BYTE = unsigned char DataReader^ reader = DataReader::FromBuffer(buffer); BYTE *extracted = new BYTE[buffer->Length]; // NOTE: This will read directly into the allocated "extracted" buffer reader->ReadBytes(Platform::ArrayReference(extracted, buffer->Length)); // ... do something with extracted... delete [] extracted; // don't forget to free the space 

Use el método de extensión como un método estático :

 IBuffer *buffer; array^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer);