2

バイト配列から null で終了する文字列を読み込もうとしています。関数のパラメータはエンコーディングです。

string ReadString(Encoding encoding)

たとえば、次のエンコーディングの「foo」は次のとおりです。

UTF-32: 66 00 00 00 6f 00 00 00 6f 00 00 00
UTF-8:  66 6f 6f
UTF-7:  66 6f 6f 2b 41 41 41 2d

すべてのバイトを配列にコピーし (ヌル ターミネータまで読み取る)、その配列を に渡しencoding.GetString()た場合、文字列が UTF-32 でエンコードされている場合、アルゴリズムは 2 番目のバイトの後に「ヌル ターミネータ」に到達するため、機能しません。 .

だから私は二重の質問があります.ヌルターミネータはエンコーディングの一部ですか? そうでない場合、文字列を1文字ずつデコードし、次のバイトでヌルターミネータをチェックするにはどうすればよいですか?

前もって感謝します

(提案も大歓迎です)

編集:

「foo」が null で終了し、utf-32 でエンコードされている場合、どちらになりますか?:

1. 66 00 00 00 6f 00 00 00 6f 00 00 00   00
2. 66 00 00 00 6f 00 00 00 6f 00 00 00   00 00 00 00
4

3 に答える 3

1

Null ターミネータはエンコーディングの一部ではありませんが、C などの一部のプログラミング言語で使用される文字列表現です。内部的に System.String は常に UTF-16 ですが、エンコーディングを使用してさまざまな表現を出力できます。

2番目の部分は... UTF8EncodingやUTF32EncodingなどのSystem.Textのクラスを使用して、文字列を読み取ります。パラメータに基づいて適切なものを選択するだけです...

于 2010-12-03T03:39:39.977 に答える
1

これは私にとってはうまくいくようです (バイト配列から Unicode の null で終了する文字列を読み取る実際のコードのサンプル):

 //trim null-termination from end of string
 byte[] languageId = ...
 string language = Encoding.Unicode.GetString(languageId, 
                                              0,
                                              languageId.Length).Trim('\0'); 
于 2010-12-03T03:39:52.710 に答える
1

null ターミネータは「論理的に」文字列の一部ではありません。ペイロードとは見なされません。文字列の終了位置を示すために、C/C++ で広く使用されています。

\0 が埋め込まれた文字列を持つことができると言いましたが、文字列が切り捨てられないように注意する必要があります。たとえば、std::string には \0 が埋め込まれていても問題はありません。しかし、 c_str() を実行し、報告された length() を考慮しないと、文字列が途切れて表示されます。

于 2010-12-03T03:49:37.263 に答える