【问题标题】:Convert BYTE* to Array<byte>^将 BYTE* 转换为 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,则避免复制可能有点棘手。这当然是可能的)。

标签: c++-cx


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2019-04-04
        • 2023-01-21
        • 2014-04-18
        • 2013-06-26
        • 2020-04-27
        • 2011-06-08
        • 1970-01-01
        • 2013-01-17
        • 2016-05-25
        相关资源
        最近更新 更多