Vraag Een reeks bytes uit Windows halen :: Opslag :: Streams :: IBuffer


Ik heb een object dat de interface implementeert Windows::Storage::Streams::IBuffer, en ik wil er een reeks bytes uit halen, maar tijdens het bekijken van de documentatie ziet deze interface er vrij nutteloos uit, en de documentatie biedt geen enkele verwijzing naar een andere klasse die met deze interface kan worden gecombineerd om mijn doel te bereiken. Alles wat ik tot nu toe heb gevonden met Google is een verwijzing naar de .Net-klasse WindowsRuntimeBufferExtensions maar ik gebruik C ++ dus dit is ook een doodlopende weg.

Kan iemand een hint geven over het ophalen van een array van bytes Windows::Storage::Streams::IBuffer in C ++?


14
2017-08-07 20:43


oorsprong


antwoorden:


U kunt IBufferByteAccess gebruiken, via exotische COM-casts:

byte* GetPointerToPixelData(IBuffer^ buffer)
{
   // Cast to Object^, then to its underlying IInspectable interface.

   Object^ obj = buffer;
   ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(obj));

   // Query the IBufferByteAccess interface.
   ComPtr<IBufferByteAccess> bufferByteAccess;
   ThrowIfFailed(insp.As(&bufferByteAccess));

   // Retrieve the buffer data.

   byte* pixels = nullptr;
   ThrowIfFailed(bufferByteAccess->Buffer(&pixels));

   return pixels;

}

Codevoorbeeld gekopieerd van http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html


12
2018-01-05 14:12



Controleer ook deze methode:

IBuffer -> Platform :: Array
CryptographicBuffer.CopyToByteArray

Platform :: Array -> IBuffer
CryptographicBuffer.CreateFromByteArray

Als een kanttekening, als je wilt creëren Platform::Array van eenvoudige C ++ -array die u zou kunnen gebruiken Platform::ArrayReference, bijvoorbeeld:

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

9
2018-05-20 08:57



Dit is een C ++ / CX-versie:

std::vector<unsigned char> getData( ::Windows::Storage::Streams::IBuffer^ buf )
{
    auto reader = ::Windows::Storage::Streams::DataReader::FromBuffer(buf);

    std::vector<unsigned char> data(reader->UnconsumedBufferLength);

    if ( !data.empty() )
        reader->ReadBytes(
            ::Platform::ArrayReference<unsigned char>(
                &data[0], data.size()));

    return data;
}

Zie voor meer informatie Array en WriteOnlyArray (C ++ / CX).


7
2018-01-17 16:39



Zoals eerder gezegd, WindowsRuntimeBufferExtensions van de naamruimte System::Runtime::InteropServices::WindowsRuntime is alleen beschikbaar voor .Net-toepassingen en niet voor native C ++ -toepassingen.

Een mogelijke oplossing zou zijn om te gebruiken Windows::Storage::Streams::DataReader:

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

    (...)
}

5
2017-08-13 20:12



Dit zou met WinRT-extensies moeten werken:

// 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<BYTE>(extracted, buffer->Length));

// ... do something with extracted...

delete [] extracted; // don't forget to free the space

3
2018-03-13 13:45



Gebruik de uitbreidingsmethode als een statische methode:

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

0
2017-08-07 20:55