Получение массива байтов из Windows :: Storage :: Streams :: IBuffer

У меня есть объект, который реализует интерфейс Windows::Storage::Streams::IBuffer , и я хочу получить из него массив байтов, однако, глядя на документацию, этот интерфейс выглядит довольно бесполезным, а документация не предлагает любая ссылка на любой другой class, который может быть объединен с этим интерфейсом для достижения моей цели. Все, что я нашел до сих пор с google, является ссылкой на .Net class WindowsRuntimeBufferExtensions, но я использую C ++, так что это тоже тупик.

Может ли кто-нибудь дать подсказку о том, как получить массив байтов из Windows::Storage::Streams::IBuffer в C ++?

Вы можете использовать IBufferByteAccess через экзотические COM-ролики:

 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; } 

Пример кода скопирован из http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html

Также проверьте этот метод:

IBuffer -> Платформа :: Массив
CryptographicBuffer.CopyToByteArray

Платформа :: Массив -> IBuffer
CryptographicBuffer.CreateFromByteArray

В качестве примечания, если вы хотите создать Platform::Array из простого массива C ++, вы можете использовать Platform::ArrayReference , например:

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

Это версия 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; } 

Для получения дополнительной информации см. Array и WriteOnlyArray (C ++ / CX) .

Как упоминалось ранее, WindowsRuntimeBufferExtensions из пространства имен System::Runtime::InteropServices::WindowsRuntime доступен только для приложений .Net, а не для собственных приложений на C ++.

Возможным решением будет использование 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]; (...) } 

Это должно работать с расширениями 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 

Используйте метод расширения как статический метод :

 IBuffer *buffer; array^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer); 
  • Настройка заголовка авторизации HttpClient
  • Как Windows 8 Runtime (приложения для WinRT / Windows Store / Windows 10 Universal App) сравниваются с Silverlight и WPF?
  • Как сравнить объект Color и получить ближайший цвет в цвете ?
  • WinRT и региональные настройки. Правильный способ форматирования дат и чисел на основе региональных настроек пользователя?
  • Событие приостановки, не использующее WinRT
  • Данная System.Uri не может быть преобразована в Windows.Foundation.Uri
  • Как resize изображения в C # WinRT / winmd?
  • Как приложение Metro в Windows 8 взаимодействует с настольным настольным окном на одном компьютере?
  • Давайте будем гением компьютера.