我有一个实现接口Windows::Storage::Streams::IBuffer
的对象,我希望从中获取一个字节数组,但是在查看文档时,这个接口看起来很没用,而且文档没有提供任何参考可以与此界面结合使用的任何其他类来实现我的目的。到目前为止我用谷歌找到的只是对.Net类WindowsRuntimeBufferExtensions的引用,但我使用的是C ++,所以这也是一个死胡同。
有人可以提示如何在C ++中从Windows::Storage::Streams::IBuffer
获取字节数组吗?
答案 0 :(得分: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;
}
从http://cm-bloggers.blogspot.fi/2012/09/accessing-image-pixel-data-in-ccx.html
复制的代码示例答案 1 :(得分:9)
同时检查此方法:
IBuffer - &gt;平台::阵列
CryptographicBuffer.CopyToByteArray
Platform :: Array - &gt; IBuffer
CryptographicBuffer.CreateFromByteArray
作为旁注,如果要从简单的C ++数组创建Platform::Array
,可以使用Platform::ArrayReference
,例如:
char* c = "sdsd";
Platform::ArrayReference<unsigned char> arraywrapper((unsigned char*) c, sizeof(c));
答案 2 :(得分: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;
}
有关详细信息,请参阅Array and WriteOnlyArray (C++/CX)。
答案 3 :(得分: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];
(...)
}
答案 4 :(得分:3)
这适用于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
答案 5 :(得分:0)
由于该问题被标记为c++,因此这是使用C++/WinRT的解决方案。它在本质上与this answer相同,但更易于访问。 data()
投影上的(未记录)IBuffer
助手完成了所有繁重的工作:
uint8_t* GetPointerToPixelData(::winrt::Windows::Storage::Streams::IBuffer const& buffer)
{
return buffer.data();
}
不幸的是,到目前为止还没有正式的文档,我只是在WritableBitmap.PixelBuffer
属性的示例代码中偶然发现了这一点(请确保从“ C ++ / WinRT” 中选择语言下拉菜单)。
从语言下拉列表中选择“ C ++ / CX” 时,也可以从该文档条目中获得相同的解决方案(查询IBufferByteAccess
接口。
答案 6 :(得分:-1)
Use the extension method like a static method:
IBuffer *buffer;
array<unsigned char>^ result= System::Runtime::InteropServices::WindowsRuntime::WindowsRuntimeBufferExtensions::ToArray(buffer);