C++/CLI 将 byte* 转换为 Managed Byte[]
C++/CLI Conversion of byte* to Managed Byte[]
我在一个 C++/CLI 项目中,我有一个 byte*
变量,我想尽可能高效地将其完全转换为托管 array<byte>
。
目前,我看到的唯一方法是手动创建托管 array<byte>
对象,然后从 byte*
变量中复制单个字节,如下所示:
void Foo(byte* source, int bytesCount)
{
auto buffer = gcnew array<byte>(bytesCount);
for (int i = 0; i < bytesCount; ++i)
{
buffer[i] = source[i];
}
}
有没有其他方法可以更有效地做到这一点?理想情况下,根本不必复制内存。
如果没有,有没有办法更干净地做到这一点?
您不能在不复制的情况下从非托管缓冲区创建托管数组。
但是,您不需要在循环中复制单个字节。您可以 pin 托管数组(参见 pin_ptr
),然后将字节直接从非托管缓冲区复制到托管数组的内存中,例如 memcpy()
或同等学历。
void Foo(byte* source, int bytesCount)
{
auto buffer = gcnew array<byte>(bytesCount);
{
pin_ptr<byte> p = &buffer[0];
byte *cp = p;
memcpy(cp, source, bytesCount);
}
// use buffer as needed...
}
我在一个 C++/CLI 项目中,我有一个 byte*
变量,我想尽可能高效地将其完全转换为托管 array<byte>
。
目前,我看到的唯一方法是手动创建托管 array<byte>
对象,然后从 byte*
变量中复制单个字节,如下所示:
void Foo(byte* source, int bytesCount)
{
auto buffer = gcnew array<byte>(bytesCount);
for (int i = 0; i < bytesCount; ++i)
{
buffer[i] = source[i];
}
}
有没有其他方法可以更有效地做到这一点?理想情况下,根本不必复制内存。
如果没有,有没有办法更干净地做到这一点?
您不能在不复制的情况下从非托管缓冲区创建托管数组。
但是,您不需要在循环中复制单个字节。您可以 pin 托管数组(参见 pin_ptr
),然后将字节直接从非托管缓冲区复制到托管数组的内存中,例如 memcpy()
或同等学历。
void Foo(byte* source, int bytesCount)
{
auto buffer = gcnew array<byte>(bytesCount);
{
pin_ptr<byte> p = &buffer[0];
byte *cp = p;
memcpy(cp, source, bytesCount);
}
// use buffer as needed...
}