2011-05-10 106 views
1

是否有可能将阵列< Byte> ^转换为字节*?数组<Byte> ^与字节*之间的区别是什么?

下面的代码如何改变以返回一个字节*?

array<Byte>^ StrToByteArray(System::String^ unicodeString) 
{ 
    UTF8Encoding^ utf8 = gcnew UTF8Encoding; 
    array<Byte>^ encodedBytes = utf8->GetBytes(unicodeString); 
    return encodedBytes; 
} 

回答

2

array ^是托管堆中对象的句柄,byte *是指向非托管字节的指针。您不能在它们之间进行投射,但可以修复托管数组并获取指向其内的元素的指针。

编辑响应第一评论:

下面是this page MSDN上

采取了代码示例,你最感兴趣的位是无效的load()方法。在这里,他们钉住阵列,并采取一个指针,其中的第一个元素...

// pin_ptr_1.cpp 
// compile with: /clr 
using namespace System; 
#define SIZE 10 

#pragma unmanaged 
// native function that initializes an array 
void native_function(byte* p) { 
    for(byte i = 0 ; i < 10 ; i++) 
     p[i] = i; 
} 
#pragma managed 

public ref class A { 
private: 
    array<byte>^ arr; // CLR integer array 

public: 
    A() { 
     arr = gcnew array<byte>(SIZE); 
    } 

    void load() { 
     pin_ptr<byte> p = &arr[0]; // pin pointer to first element in arr 
     byte* np = p; // pointer to the first element in arr 
     native_function(np); // pass pointer to native function 
    } 

    int sum() { 
     int total = 0; 
     for (int i = 0 ; i < SIZE ; i++) 
      total += arr[i]; 
     return total; 
    } 
}; 

int main() { 
    A^ a = gcnew A; 
    a->load(); // initialize managed array using the native function 
    Console::WriteLine(a->sum()); 
} 
+0

你能否提供这样的解决方案吗? – Andy 2011-05-10 10:31:08

+2

这是针对Visual Studio 2003的。[此处](http://msdn.microsoft.com/zh-cn/library/1dz8byfh%28v=vs.80%29.aspx)是Visual Studio 2005及更多版本的链接,它使用'pin_ptr'('__pin'不再支持) – 2011-05-10 11:06:06

+1

我修改了帖子更新的示例+链接,感谢您指出我的错误:) – MattDavey 2011-05-10 12:20:14

0

不,你可以不投,但阵列有一个返回称为“数据()”

编辑原始阵列的方法:NVM,还以为你在谈论的STL类的数组。

+0

它告诉我'数据':不是'系统::阵列'的成员。 – Andy 2011-05-10 10:11:34

相关问题