将 BYTE* 转换为 Array<byte>^

Posted

技术标签:

【中文标题】将 BYTE* 转换为 Array<byte>^【英文标题】:Convert BYTE* to Array<byte>^ 【发布时间】:2014-07-21 16:52:31 【问题描述】:

在 C++/CX 中是否可以将 byte* 转换为 Array^?

目前我通过复制每个值来实现这一点,我知道这不是空间/性能效率。

我目前的实现是:

Array<byte>^ arr = ref new Array<byte>(byteCount);
for (int i = 0; i < byteCount; i++)

    arr[i] = *(bytes + i);

【问题讨论】:

使用 ArrayReference 代替。 @HansPassant MSDN 说“通过使用 ArrayReference 填充 C 样式的数组,您可以避免先复制到 Platform::Array 变量,然后再复制到C 风格的数组”。所以我猜当我的用例是从 C 样式数组复制到 Platform::Array 类时,ArrayReference 用于复制到 C 样式数组。 请注意,通过 ABI 传递数组无论如何都会产生副本。为避免复制,请使用 IBuffer(尽管如果其中一方是 .NET,则避免复制可能有点棘手。这当然是可能的)。 【参考方案1】:

有一个数组构造函数(MSDN): Array(T* data, unsigned int size);

因此,在您的情况下,只需执行以下操作: Array&lt;byte&gt;^ arr = ref new Array&lt;byte&gt;(bytes, byteCount);

This 是一篇关于 C++/CX 和 WinRT 数组模式的精彩文章。

【讨论】:

【参考方案2】:

如果您关心性能,请使用 Platform::ArrayReference 而不是 Platform::Array

如果你需要Platform::Array,你可以像这样投射

uint8_t *data;
size_t data_size;
...

auto arrayRef = new ArrayReference<uint8_t>(data, data_size);
Array^ array = reinterpret_cast<Array<uint8_t>^>(arrayRef)

【讨论】:

【参考方案3】:

是的,你也可以使用

Array<byte>^ t = ref new Platform::Array<byte>(byteReaded);
CopyMemory(t->Data, buff, byteReaded);

用于复制或访问使用

t->Data

【讨论】:

以上是关于将 BYTE* 转换为 Array<byte>^的主要内容,如果未能解决你的问题,请参考以下文章

C# 将 ReadOnlyCollection<int> 转换为 byte[] 数组

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?

Scala 库将数字(Int、Long、Double)与 Array[Byte] 相互转换

从 byte[] 创建 AudioClip

将 ArrayList<Byte> 转换为 byte[] [重复]

C# 就地将 `int[]` 数组转换为 `byte[]` 数组