我有一个实现该接口的对象Windows::Storage::Streams::IBuffer
,我想摆脱它字节数组,但同时看着这个界面看起来好看不中用的文档,该文档不提供任何涉及可能与此接口实现我的目的,结合其他类。 所有我发现迄今与谷歌是在.NET类的引用WindowsRuntimeBufferExtensions ,但我使用C ++所以这也是死路一条。
有人可以给如何从获取字节数组暗示Windows::Storage::Streams::IBuffer
在C ++?
我有一个实现该接口的对象Windows::Storage::Streams::IBuffer
,我想摆脱它字节数组,但同时看着这个界面看起来好看不中用的文档,该文档不提供任何涉及可能与此接口实现我的目的,结合其他类。 所有我发现迄今与谷歌是在.NET类的引用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<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;
}
代码示例从复制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<unsigned char> arraywrapper((unsigned char*) c, sizeof(c));
这是一个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;
}
有关详细信息,请参阅阵列和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<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];
(...)
}
这应该与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<BYTE>(extracted, buffer->Length));
// ... do something with extracted...
delete [] extracted; // don't forget to free the space
由于这个问题被标记C ++ ,这里使用的解决方案C ++ / WinRT的 。 它在本质上不一样这个答案引擎盖下,但这样更容易获得。 的(无证) data()
的助手IBuffer
投影做所有繁重:
uint8_t* GetPointerToPixelData(::winrt::Windows::Storage::Streams::IBuffer const& buffer)
{
return buffer.data();
}
不幸的是没有官方文档(还),我只在该示例代码碰到这个偶然WritableBitmap.PixelBuffer
属性(请务必在右上方从语言下拉列表中选择“C ++ / WinRT的”)。
相同的溶液(查询的IBufferByteAccess
从语言下拉菜单中选择“C ++ / CX”当接口)也可从该文档条目。
使用像一个静态方法扩展方法 :
IBuffer *buffer;
array<unsigned char>^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer);