2011-05-11 3 views
0

可能性の重複:
Whats the diffrence between an array<Byte>^ and a byte*?System :: String ^をバイト*にUTF8Encodeできますか?

私はしかし、UTF8Encodingについての作品を翻訳++、CにはいくつかのC#コードを翻訳していますが、私は私がバイトを必要としながら^配列を返す++、C *動けなくなります転回型として。私はこのコードに長時間を費やそうとしていますが、私は失敗し続けます。どのようにバイト*を返すように変更できますか?

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

答えて

1

各要素を手動でコピーすることなく、配列からX *への変換を行う方法がないと思います。これは次のスニペットのようになります。

byte* StrToByteArray(System::String^ unicodeString) 
{ 
    UTF8Encoding^ utf8 = gcnew UTF8Encoding; 
    array<Byte>^ encodedBytes = utf8->GetBytes(unicodeString); 
    const size_t len = encodedBytes->Length; 
    byte* encodedBytesRaw = new byte[len+1]; 
    for(int i=0; i<len; ++i) 
     encodedBytesRaw[i] = encodedBytes[i]; 
    encodedBytesRaw [len]=0; 
    return encodedBytesRaw; 
} 

呼び出し元は、終了すると、返されたバイト配列を削除する必要があります。

+0

返信いただきありがとうございます。私はそれを動作させるためにコードに3つの変更を加えなければならなかった、あなたは1つを忘れてしまった。 forではバイトを使用していて、バイトは使用していません。行のバイト[len] = 0;まだエラーが出てくるが、私はそれを残してみるとすべてがうまくいくようだ。ここでそれを使ったのは何ですか? – Andy

+0

@Andy:utf-> GetBytesがヌルで終了するデータを返すかどうかわからないので、それは安全対策であった。そのため、安全であるためにゼロバイトが追加されています(GetBytesのドキュメントでゼロ終了データが返された場合は、その行を省略してください)。 – smerlin

+0

入力文字列にヌル文字を含めることができ、これらはUTF8で値「0x00」のコード単位としてエンコードされます。 – dalle

関連する問題