从Windows :: Storage :: Streams :: IBuffer中获取一个字节数组

Ala*_*ito 14 c++ stream windows-8 windows-runtime visual-studio-2012

我有一个实现接口的对象,Windows::Storage::Streams::IBuffer我希望从中获取一个字节数组,但是在查看文档时,这个接口看起来很没用,并且文档没有提供任何可以组合的其他类的引用用这个界面来实现我的目的.到目前为止我用google发现的只是对.Net类WindowsRuntimeBufferExtensions的引用,但我使用的是C++,所以这也是一个死胡同.

有人可以提示如何从Windows::Storage::Streams::IBufferC++中获取字节数组吗?

Ber*_*eux 12

您可以通过异国情调的COM演员使用IBufferByteAccess:

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;

}
Run Code Online (Sandbox Code Playgroud)

http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html复制的代码示例


小智 9

还要检查此方法:

IBuffer - > Platform :: Array
CryptographicBuffer.CopyToByteArray

Platform :: Array - > IBuffer
CryptographicBuffer.CreateFromByteArray

作为旁注,如果您想Platform::Array使用简单的C++数组创建Platform::ArrayReference,例如:

char* c = "sdsd";
Platform::ArrayReference<unsigned char> arraywrapper((unsigned char*) c, sizeof(c));
Run Code Online (Sandbox Code Playgroud)


小智 7

这是一个C++/CX版本:

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;
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Array和WriteOnlyArray(C++/CX).


Ala*_*ito 5

如前所述,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<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];

    (...)
}
Run Code Online (Sandbox Code Playgroud)