2

如何在托管 c++/cli 中将固定字节数组转换为字符串?
例如,我有以下 Byte 数组。

Byte byte_data[5];
byte_data[0]='a';
byte_data[1]='b';
byte_data[2]='c';
byte_data[3]='d';
byte_data[4]='e';

我试过下面的代码
String ^mytext=System::Text::UTF8Encoding::UTF8->GetString(byte_data);

我收到以下错误:
error C2664: 'System::String ^System::Text::Encoding::GetString(cli::array<Type,dimension> ^)' : cannot convert parameter 1 from 'unsigned char [5]' to 'cli::array<Type,dimension> ^'

4

3 回答 3

2

这是一种选择:

array<Byte>^ array_data = gcnew array<Byte>(5);
for(int i = 0; i < 5; i++)
    array_data[i] = byte_data[i];
System::Text::UTF8Encoding::UTF8->GetString(array_data);

没有编译,但我想你明白了。

或者使用 String 构造函数,如@ta.speot.is 所示,编码设置为System.Text::UTF8Encoding.

于 2013-01-28T01:58:40.437 回答
2

用一些关于在指向有符号和无符号类型的指针之间转换的知识武装自己,然后你应该设置为使用String::String(SByte*, Int32, Int32). 阅读页面上的备注也可能是值得的,特别是关于编码。

我已经从此处的页面复制了示例:

// Null terminated ASCII characters in a simple char array 
char charArray3[4] = {0x41,0x42,0x43,0x00};
char * pstr3 =  &charArray3[ 0 ];
String^ szAsciiUpper = gcnew String( pstr3 );
char charArray4[4] = {0x61,0x62,0x63,0x00};
char * pstr4 =  &charArray4[ 0 ];
String^ szAsciiLower = gcnew String( pstr4,0,sizeof(charArray4) );

// Prints "ABC abc"
Console::WriteLine( String::Concat( szAsciiUpper,  " ", szAsciiLower ) );

// Compare Strings - the result is true
Console::WriteLine( String::Concat(  "The Strings are equal when capitalized ? ", (0 == String::Compare( szAsciiUpper->ToUpper(), szAsciiLower->ToUpper() ) ? (String^)"TRUE" :  "FALSE") ) );

// This is the effective equivalent of another Compare method, which ignores case
Console::WriteLine( String::Concat(  "The Strings are equal when capitalized ? ", (0 == String::Compare( szAsciiUpper, szAsciiLower, true ) ? (String^)"TRUE" :  "FALSE") ) );
于 2013-01-28T02:50:58.790 回答
0

对于那些对另一种工作解决方案感兴趣的人。我使用了 ta.speot.is 的笔记并开发了一个可行的解决方案,您应该可以使用这个解决方案或 Rasmus 提供的解决方案。

Byte byte_data[5];
byte_data[0]='a';
byte_data[1]='b';
byte_data[2]='c';
byte_data[3]='d';
byte_data[4]='e';

char *pstr3 =  reinterpret_cast<char*>(byte_data);
String^ example1 = gcnew String( pstr3 );//Note: This method FAILS if the string is not null terminated
                                        //After executing this line the string contains garbage on the end example1="abcde<IqMŸÖð"

String^ example2 = gcnew String( pstr3,0,sizeof(byte_data));    //String Example 2 correctly contains the expected string even if it isn't null terminated
于 2013-01-28T06:16:40.067 回答